#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
тип из-за не указания их типа.