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

TypeScript泛型条件类型无法按字段值推导属性类型如何解决?

你当前写法的核心问题是:使用myType时未传入具体泛型参数,默认使用了AllContentType联合类型,条件类型会返回所有分支的联合结果string | number,TS不会根据你赋值的otherHeader字段反向推导泛型的具体值,因此无法正确缩窄body的类型。

方法1:显式指定泛型参数

直接将你使用的otherHeader具体值作为泛型传入即可:

const obj: myType<'multipart/form-data'> = { 
  otherHeader: 'multipart/form-data', 
  body: 123 // 此时body类型为number,传入字符串会触发类型错误
};

方法2:封装工厂函数自动推导泛型

如果不想每次手动声明泛型,可以封装简单的工厂函数,让TS根据传入的参数自动推导泛型类型:

function createMyType<T extends AllContentType>(val: myType<T>) {
  return val;
}

// 无需手动指定泛型,TS自动根据otherHeader的值推导T类型
const obj = createMyType({ 
  otherHeader: 'multipart/form-data', 
  body: 123 // body自动识别为number
});

const obj2 = createMyType({
  otherHeader: 'application/json',
  body: '{}' // body自动识别为string
});

方法3:改写为可辨识联合类型(无泛型方案)

如果不想使用泛型,也可以直接将myType定义为可辨识联合类型,TS会根据otherHeader的取值自动缩窄body的类型:

type MyType =
  | {
      otherHeader: 'multipart/form-data';
      body: number;
    }
  | {
      otherHeader: Exclude<AllContentType, 'multipart/form-data'>;
      body: string;
    };

const obj: MyType = {
  otherHeader: 'multipart/form-data',
  body: 123 // 自动推导body为number
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:18:02