我有一个类似工厂的函数,用于返回一个子类实例BaseApi.它目前看起来像这样(修剪掉不相关的部分):
function getApi<T extends BaseApi>(apiClass: typeof BaseApi): T {
return new apiClass();
}
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
const someApi = getApi<SomeApi>(SomeApi);
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我想<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();
}
Run Code Online (Sandbox Code Playgroud)
我发现TS不明白这种用法T.有没有办法做到这一点?
Rya*_*ugh 17
你真正想要的是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功能
| 归档时间: |
|
| 查看次数: |
10621 次 |
| 最近记录: |