TypeScript调用泛型方法时如何传入动态确定的泛型类型
错误原因
- TypeScript 泛型是静态编译期特性,运行时会完全擦除,不能将运行时才确定的变量(此处
realType是运行时查询得到的构造函数值)直接作为泛型参数传入,泛型参数要求传入的是类型而非值。 - 你提供的代码本身存在语法疏漏:
fetchQuux函数的泛型定义缺少闭合尖括号,<T extends Quux()应改为<T extends Quux>()。
修复方案
最合理的实现方式是把动态获取的构造函数作为普通参数传入函数,让TypeScript自动推导泛型类型,无需手动指定泛型参数:
第一步:修改fetchQuux函数定义
// 泛型T约束为Quux的子类,入参接收T的构造函数,返回值为T的实例 function fetchQuux<T extends Quux>(ctor: new () => T): T { // 直接用构造函数实例化,比类型断言`as T`更安全 const result = new ctor(); console.log('result', result); return result; }
第二步:调整调用逻辑
const realType = lookupQuuxType('Foo'); // 先判空处理避免undefined报错 if (realType) { // TS自动从入参realType的类型推导出泛型T的类型,不需要手动传泛型参数 const quuxInstance = fetchQuux(realType); }
可选优化:提升lookup返回值的类型精度
如果要让传入字面量字符串查询时得到更精准的类型,可以给lookupQuuxType加函数重载:
function lookupQuuxType(typeName: 'Foo'): typeof Foo | undefined function lookupQuuxType(typeName: 'Bar'): typeof Bar | undefined function lookupQuuxType(typeName: string): typeof Quux | undefined { return quuxBundle[typeName]; }
此时调用lookupQuuxType('Foo')得到的realType类型会自动缩小为typeof Foo | undefined,后续fetchQuux返回的实例类型也会被推导为Foo而非通用的Quux。
补充:如果你确实需要手动指定泛型参数,可以使用
typeof操作符获取值的类型,示例如下,但不推荐这种写法,远不如自动推导简洁安全:if (realType) { const quuxInstance = fetchQuux<Exclude<typeof realType, undefined>['prototype']>(realType); }
内容的提问来源于stack exchange,提问作者a1-----
相关产品推荐
相关产品推荐

