TypeScript泛型类构造器中如何让函数返回类型依赖对象其他字段
问题原因
TypeScript 目前不支持部分泛型参数推断,当你手动指定了第一个泛型参数X时,第二个泛型参数T如果没有手动传入,就会直接使用你定义的默认值any,而非根据构造函数入参自动推断,这就是test返回值变为any的原因。
解决方案
方案1:柯里化工厂函数拆分泛型(推荐)
将需要手动指定的泛型和需要自动推断的泛型拆分,你只需要手动声明入参X的类型,剩余类型会由TS自动推断:
class R1 { async resolve(): Promise<string> { return 'asd' } } class R2 { async resolve(): Promise<{ asd: number }> { return {asd:123} } } type R = R1 | R2 type Args<X, T extends R> = { type: T test: (x:X) => T, } class A<X, T extends R> { constructor(a: Args<X, T>) {} } // 新增工厂函数 function createA<X>() { return <T extends R>(args: Args<X, T>) => new A<X, T>(args) } // 使用示例 createA<number>()({ type: new R2(), test: (x) => { // x自动推导为number类型,test返回值自动推导为R2 return new R2() } })
方案2:手动传入全部泛型参数
如果不想改动原有类的结构,也可以在实例化时显式传入所有泛型参数:
new A<number, R2>({ type: new R2(), test: (x) => { // x为number类型,test返回值为R2类型 return new R2() } })
优化建议
你可以把原有类定义中T的默认值从any改为R,避免未传入泛型时出现不安全的any类型:
// 修改前 class A<X, T extends R = any> { // 修改后 class A<X, T extends R = R> {
内容的提问来源于stack exchange,提问作者Philiiiiiipp
相关产品推荐
相关产品推荐

