为什么intersection type(交叉类型)并非多个类型的属性交集?
交叉类型命名逻辑解答
首先明确结论:交叉类型(intersection type)和集合论中的交集概念完全对应,你产生的认知偏差是因为混淆了交集的运算对象。
类型的本质是「符合该类型约束的所有值构成的集合」,我们可以从集合的角度重新理解你的示例:
type o1 = {a: string, b: string} type o2 = {a: string, c: string} type o3 = o1 & o2
o1对应的集合,是所有至少拥有a:string、b:string两个属性的对象的集合o2对应的集合,是所有至少拥有a:string、c:string两个属性的对象的集合
两个集合取交集,得到的是同时属于两个集合的值的集合。也就是说,o3类型的值必须同时满足o1和o2的约束,自然需要同时拥有a、b、c三个属性,这完全符合交集的定义。
你之前的直觉是对「类型的属性集合」取交集,那是另一种运算:如果要得到仅包含两个类型共有属性的类型,正确的写法是:
type CommonKey = keyof o1 & keyof o2 type OnlyCommon = Pick<o1, CommonKey>
此时的OnlyCommon才是仅拥有a属性的类型,和交叉类型的运算逻辑完全不同。
我们还可以用另一个简单例子验证交叉类型的交集本质:number & string的结果是never,因为不存在任何值同时属于数字集合和字符串集合,完全符合交集运算"取两个集合公共部分"的逻辑。
内容的提问来源于stack exchange,提问作者Chor
相关产品推荐
相关产品推荐

