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

TypeScript泛型问题:如何获取索引记录中函数的返回值类型

问题解决思路

错误原因

你遇到的错误核心在于类型不匹配:

  • Types对象中每个函数的返回值是类的构造函数类型(typeof Method1),而非类的实例类型(Method1)。
  • 你尝试传入new Method1()(实例),但泛型约束T extends ReturnType<Types[M]>要求的是构造函数类型,自然会触发类型不匹配报错。

解决方案

我们需要通过InstanceType工具类型,从构造函数类型中提取对应的实例类型,结合ReturnType获取函数返回的构造函数,最终得到需要的实例类型映射。

步骤1:保留Types的精确类型信息

用as const让TypeScript保留Types对象的精确键和值类型,避免类型被宽泛推断:

class Method1 {}
class Method2 {}

const Types = {
  'Method1': () => Method1,
  'Method2': () => Method2,
} as const;

步骤2:创建实例类型映射(可选,提升可读性)

定义一个辅助类型,将Types的键映射到对应类的实例类型:

type TypeInstances = {
  [K in keyof typeof Types]: InstanceType<ReturnType<typeof Types[K]>>
};

步骤3:修正Message类的泛型约束

使用实例类型映射约束Message的泛型参数:

class Message<M extends keyof TypeInstances, T extends TypeInstances[M]> {
  request: T;
  constructor(req: T) {
    this.request = req;
  }
};

// 正常使用,无类型错误
const msg = new Message(new Method1());

更简洁的写法(无需辅助类型)

直接在Message类中嵌套类型工具,省略辅助类型定义:

class Message<M extends keyof typeof Types> {
  request: InstanceType<ReturnType<typeof Types[M]>>;
  constructor(req: InstanceType<ReturnType<typeof Types[M]>>) {
    this.request = req;
  }
};

// 手动指定泛型,或让TS自动推断
const msg1 = new Message<"Method1">(new Method1());
const msg2 = new Message<"Method2">(new Method2());

自动推断泛型的写法

如果不需要显式指定键名M,可以让TypeScript自动推断实例类型:

class Message<T extends InstanceType<ReturnType<typeof Types[keyof typeof Types]>>> {
  request: T;
  constructor(req: T) {
    this.request = req;
  }
};

// TS自动推断T为Method1类型
const msg = new Message(new Method1());

内容的提问来源于stack exchange,提问作者Leandros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:25:00