我有一个类似工厂的函数,用于返回BaseApi
的子类实例.它现在看起来像这样(go 掉了不相关的部分):
function getApi<T extends BaseApi>(apiClass: typeof BaseApi): T {
return new apiClass();
}
我是这样使用的:
const someApi = getApi<SomeApi>(SomeApi);
这是可行的,但我希望通过传递SomeApi
构造函数来推断<SomeApi>
.如果我省略<SomeApi>
,那么someApi
被推断为BaseApi
类型,而不是SomeApi
类型.更糟糕的是,<T extends BaseApi>
和typeof BaseApi
之间实际上没有编译器相关性,所以你可以在没有编译器错误的情况下错误地执行getApi<SecondApi>(FirstApi)
之类的操作.
所以我试着把apiClass
定义为typeof T
:
function getApi<T extends BaseApi>(apiClass: typeof T): T {
return new apiClass();
}
我发现TS不理解T
的用法.有什么办法吗?