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

