Typescript 使用带有'typeof T'的泛型类型参数`

Typescript 使用带有'typeof T'的泛型类型参数`,typescript,Typescript,我有一个类似工厂的函数,用于返回BaseApi的子类实例。它目前看起来像这样(删去了不相关的部分): 我发现TS不理解T的这种用法。有什么方法可以做到这一点吗?您真正想要的是new()=>T,因为您打算将参数用作构造函数并生成T。即使您可以编写typeof T,这也不是您想要的,因为T可能没有零参数构造函数 请记住,typeof运算符接受一个值,并生成一个值T已经是一个类型;这不是一个价值观 当然,这在TypeScript常见问题解答中得到了解决。如果您使用无参数构造函数和构造函数,这些构造函数

我有一个类似工厂的函数,用于返回
BaseApi
的子类实例。它目前看起来像这样(删去了不相关的部分):


我发现TS不理解
T
的这种用法。有什么方法可以做到这一点吗?

您真正想要的是
new()=>T
,因为您打算将参数用作构造函数并生成
T
。即使您可以编写
typeof T
,这也不是您想要的,因为
T
可能没有零参数构造函数

请记住,
typeof
运算符接受一个值,并生成一个
T
已经是一个类型;这不是一个价值观


当然,这在TypeScript常见问题解答中得到了解决。如果您使用无参数构造函数和构造函数,这些构造函数接受您需要将
new()=>T
更新为
new(…args)=>T
的参数,否则您将出现编译错误。也许这应该是一个单独的问题,但是如果我的
T
扩展了一个基类(因为我使用了
),并且
BaseClass
有一个公共静态方法,比如我想调用的
myStaticMethod()
,该怎么办?有没有可能让typescript意识到这样一个事实:我不仅希望我的变量是(0-arg)构造函数(
new()=>T
),而且还希望能够在它上面调用
myStaticMethod()
?@NicolasB为什么不
arg:{new():T;myStaticMethod():any;}
那样的话?@Arad我认为你写的完全正确,它回答了我的问题。但是,如果基类中有许多静态方法,并且类型冗长,那么它的伸缩性就不太好。我仔细考虑了一下,我认为一个有效的选项是:
arg:(new()=>T)&typeof基类。交集类型的第一部分负责构造函数部分,第二部分负责静态方法。
function getApi<T extends BaseApi>(apiClass: typeof BaseApi): T {
    return new apiClass();
}
const someApi = getApi<SomeApi>(SomeApi);
function getApi<T extends BaseApi>(apiClass: typeof T): T {
    return new apiClass();
}