TypeScript: вывод аргументов функции из сигнатуры конструктора

#javascript #typescript

#javascript #typescript

Вопрос:

В качестве инструмента для компоновки у меня есть функция, которая принимает аргумент конструктора класса и возвращает функцию, которая использует переданные ей аргументы для создания экземпляра класса, в который я изначально передал.

 class Thing {
  constructor (metadata) { this.metadata = metadata; }
}

const A = (C) => (...a) => new C(...a);
const X = A(Thing);
 

Когда я наведу курсор X , я хочу, чтобы он сообщал мне, что сигнатура функции по существу (metadata) => Thing . Вместо этого в нем говорится, что подпись X is (...a) => any . Какие аннотации требуются для того, чтобы заставить TypeScript (последняя версия) правильно выводить сигнатуру X?

Ответ №1:

 const A = <T extends unknown[], K>(C: new (...args: T) => K) => (...args: T) => new C(...args);
 

Ссылка на игровую площадку

Разбивая его, у нас есть T тип массива, и мы аннотируем C , чтобы иметь конструктор (используя new ключевое слово), который принимает аргументы, обозначенные T , и возвращает значение K . Затем мы возвращаем функцию, которая по существу отменяет конструктор.

В качестве дополнительного примечания, пожалуйста, скомпилируйте с --noImplicitAny ; это даст вам полезные предупреждения для подобных вещей, когда аргументы имеют any тип из-за не указания их типа.