TypeScript交叉类型同名属性类型冲突的处理规则疑问
TypeScript 交叉类型同名属性通用处理规则
交叉类型&的核心逻辑是要求值同时满足所有参与交叉的类型约束,并非简单的属性合并,同名属性的类型会按以下规则处理:
- 若同名属性为无交集的基础类型(比如
string和number),交叉后属性类型为never,不存在可以满足该类型的值 - 若同名属性为对象类型,会递归对两个对象的属性做交叉合并
- 可选属性规则与必选属性一致,只要两边的属性类型无交集,交叉后可选属性的有效类型依然为
never
代码错误原因分析
1. 必选属性y类型冲突
Bob<string>中y的类型是string,Jennie<number>中y的类型是number,二者无交集,交叉后y的类型为never,你赋值y: 'hi'属于string类型,无法匹配never,因此触发报错。
2. 可选属性z类型冲突
Bob<string>中z的类型是string | undefined,Jennie<number>中z的类型是number | undefined,排除两边共有的undefined后,剩余的string和number无交集,因此交叉后z的有效类型为never | undefined,你赋值z: 20属于number类型,同样无法匹配never,触发类型错误。
修复方案
如果你的需求是合并两个接口的所有属性,同名属性取指定类型,可以使用Omit工具类剔除冲突属性后再交叉:
// 剔除Bob中的y和z属性,保留Jennie中的对应类型 type MyCombinedType = Omit<Bob<string>, 'y' | 'z'> & Jennie<number> let myIntersection : MyCombinedType = { x: 20, y: 123, q: 30, z: 20 } console.log(myIntersection);
如果需要保留同名属性的双类型支持,可以将对应属性定义为联合类型:
interface Bob<T> { x : number; y : string | number; z? : T | number; }
内容的提问来源于stack exchange,提问作者Alk
相关产品推荐
相关产品推荐

