为什么TypeScript中&运算符对联合类型取交、对对象类型合并属性?
TypeScript 交叉类型 & 行为差异原理解析
交叉类型运算符&的核心逻辑是要求值必须同时符合运算符两侧的所有类型约束,它的表现不是固定的“取交集”或者“取并集”,不同场景下的行为差异,本质是“同时满足两边约束”这个规则的自然推导结果。
联合类型使用 & 的场景
示例代码:
type fruits = 'apple' | 'pear' | 'tomato' type vegetables = 'spinach' | 'cabbage' | 'tomato'; type gardenPlants = fruits & vegetables;
联合类型的含义是“值属于列出的任意一个成员即可”,如果要求一个值同时属于两个联合类型,那它只能是两个联合共有的成员。所以上述代码中gardenPlants的最终类型是'tomato',只有这个值同时满足“属于fruits联合”和“属于vegetables联合”两个约束,也就是两个联合的交集。
对象类型使用 & 的场景
示例代码:
type Employee = { name: string; age: number } type Company = { name: string, address: string, year: number} type Info = keyof (Employee & Company);
对象类型的含义是“值必须拥有声明里列出的所有属性”,如果要求一个对象同时符合两个对象类型的约束,就必须同时拥有两个类型要求的所有属性。所以Employee & Company的交叉类型,是同时包含name、age、address、year四个属性的新对象类型,相当于合并了两边的所有属性。
而keyof运算符作用于对象类型时,会返回该对象所有属性名的联合类型,因此最终Info的类型是'name' | 'age' | 'address' | 'year',也就是两个对象所有属性名的联合。
内容的提问来源于stack exchange,提问作者Ofentse Nglazi
相关产品推荐
相关产品推荐

