You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:54:03