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
相关产品推荐
相关产品推荐

