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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:03