我有一个类似工厂的函数,用于返回BaseApi
的子类实例。它目前看起来像这样(修剪掉了不相关的部分):
function getApi<T extends BaseApi>(apiClass: typeof BaseApi): T {
return new apiClass();
}
我这样使用它:
const someApi = getApi<SomeApi>(SomeApi);
这很有效,但我想通过<SomeApi>
构造函数传递来推断SomeApi
。如果我省略<SomeApi>
那么{{1} }推断为someApi
类型,而不是BaseApi
。更糟糕的是,SomeApi
和<T extends BaseApi>
之间确实没有编译器关联是相同的,因此如果没有编译器错误,您可能会错误地执行typeof BaseApi
之类的操作。
所以我尝试将getApi<SecondApi>(FirstApi)
定义为apiClass
:
typeof T
我发现TS不理解function getApi<T extends BaseApi>(apiClass: typeof T): T {
return new apiClass();
}
的这种用法。有没有办法做到这一点?
答案 0 :(得分:13)
您真正想要的是new() => T
,因为您打算将该参数用作构造函数并生成T
。即使您可以编写typeof T
,这也不是您想要的,因为T
可能没有零参数构造函数。
请注意,typeof
运算符采用值并生成值。 T
已经是一种类型;它不是一个价值。
当然,这在TypeScript FAQ https://github.com/Microsoft/TypeScript/wiki/FAQ#why-cant-i-write-typeof-t-new-t-or-instanceof-t-in-my-generic-function
中得到了解决