我有一个类似工厂的函数,用于返回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的用法.有什么办法吗?

推荐答案

实际上你想要的是new() => T,因为你想把这个参数用作构造函数,然后产生一个T.即使你可以写typeof T,那也不是你想要的,因为T可能没有零参数构造函数.

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

当然,这在TypeScript常见问题解答https://github.com/Microsoft/TypeScript/wiki/FAQ#why-cant-i-write-typeof-t-new-t-or-instanceof-t-in-my-generic-function中得到了解决

Typescript相关问答推荐

已定义但从未使用通用推断的错误

为什么当我试图从数据库预填充时,属性x不存在于类型{错误:字符串; }.ts(2339)上?

创建一个将任意命名类型映射到其他类型的TypScript通用类型

TypeScript泛型参数抛出错误—?&#"' 39;预期"

角形标题大小写所有单词除外

如何根据模板类型实现不同的模板函数行为?

如何推断哪个特定密钥与泛型匹配?

使用打字Angular 中的通用数据创建状态管理

对未到达受保护路由的路由环境做出react

Cypress页面对象模型模式.扩展Elements属性

已解决:如何使用值类型限制泛型键?

为什么我的查询钩子返回的结果与浏览器的网络选项卡中看到的结果不同?

声明文件中的类型继承

TypeScrip:强制使用动态密钥

RXJS将对键盘/鼠标点击组合做出react

如何在不违反挂钩规则的情况下动态更改显示内容(带有状态)?

如何在try 运行独立的文字脚本Angular 项目时修复Visual Studio中的MODULE_NOT_FOUND

如何扩展RxJS?

编剧- Select 下拉框

如何向我的自定义样式组件声明 custom.d.ts ?