使用`typeof T`的泛型类型参数

时间:2016-10-25 21:20:20

标签: typescript

我有一个类似工厂的函数,用于返回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(); } 的这种用法。有没有办法做到这一点?

1 个答案:

答案 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

中得到了解决