Ваш код фактически не работает, если вызывающая сторона устанавливает T
для типа функции, например, T = (x: number) => number
, и передает значение типа T
, то есть функцию, которая требует один аргумент.Ваш код попытается вызвать эту функцию без аргументов.
Вы можете дать компилятору подсказку, что вы не намерены T
быть типом функции, ограничив T
отображаемым типом, который имеетте же свойства, но без подписи вызовов.То есть вы бы изменили объявление класса Test
на:
class Test<T extends { [P in keyof T]: T[P] }> { /* ... */ }
Тогда ошибка должна исчезнуть.Однако компилятор не остановит вас от фактического создания T
с типом функции, потому что тип функции расширяет того же типа с удаленными сигнатурами вызовов, поэтому будьте осторожны.(Поэтому я удивлен, что приведенная выше методика работает для устранения ошибки. Возможно, отсутствие ошибки может быть ошибкой. Если ошибка исправлена, я думаю, вы просто вернетесь к своему текущему решению.)