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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 17:27:02