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

TypeScript中如何简化对象属性多类型扩展的类型定义?

TypeScript类型定义简化写法问题

现有TypeScript类型定义如下:

type myType = {
  a: string,
  b: string
}

有一个函数可接收myType类型的对象,但a属性需要同时支持number类型。当前定义新类型的方式是:

type myNewType = Omit<myType, 'a'> & {
  a: string | number
}

想问有没有更简洁的写法?尝试过直接使用交叉类型:

type myNewType = myType & {
  a: number
}

但结果a的类型变成了string & number(实际等价于never类型),而非期望的string | number。


解答

直接用交叉类型的思路行不通,因为TypeScript中交叉类型对同一属性会取类型交集,string和number没有交集,最终得到的string & number就是never,完全不符合需求。

目前最简洁且通用的写法就是你一开始用的Omit结合交叉类型的方式:

type myNewType = Omit<myType, 'a'> & {a: string | number}

如果需要在项目中多次进行这类“覆盖原有类型属性”的操作,可以封装一个通用工具类型,后续复用会更方便:

// 自定义工具类型:用U的属性覆盖T的对应属性
type Override<T, U> = Omit<T, keyof U> & U;

// 使用示例
type myNewType = Override<myType, {a: string | number}>;

如果myType中只有少量其他属性,也可以用Pick保留指定属性,再结合新的属性定义,但这种写法在属性较多时不如Omit灵活:

type myNewType = Pick<myType, 'b'> & {a: string | number};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:30:53