TypeScript细碎知识点:理解Ts联合类型和交叉类型区别
TS中的联合类型 | 和交叉类型的区别
-
联合类型 " | " : 会把2者的属性进行合并,也就是形成并集,进行类型声明的时候,你的属性可以是前者,属性不能少,当时声明了几个就要写几个,也可以是后者,也可以前者+后者。
type A = { name: string, age: number } type B = { name: string, city: string } // 联合类型'|' let C:(A|B) = { // 🙆 可以是 A 类型 (属性不能少,当时声明了几个就要写几个) name:'Ts', age:33, } let D:(A|B) = { // 🙆♂️ 可以是 B 类型 (属性不能少,当时声明了几个就要写几个) name:'Ts', city:'bj' } let E:(A|B) = { // 🙆+🙆♂️ 可以是 A+B 类型 (属性不能少,当时声明了几个就要写几个) name:'Ts', age:33, city:'bj' }
-
交叉类型 " & ": 会把 2者的属性进行合并,也就是形成并集,进行类型声明的时候,你的属性必须是前者+后者,少1个都报错。不能只写前者,也不能只写后者。
type A = { name: string, age: number } type B = { name: string, city: string } // 交叉类型'&' let C:(A&B) = { //🙅不可以是 A 类型 name:'Ts', age:33, } let D:(A&B) = { //🙅♂️不可以是 B 类型 name:'Ts', city:'bj' } let E:(A&B) = { //必须可以是 A+B 类型 (属性不能少,当时声明了几个就要写几个) name:'Ts', age:33, city:'bj' }
⏰ 注意: 交叉运算符的特性
唯一性:A & A 等价于 A
满足交换律:A & B 等价于 B & A
满足结合律:(A & B) & C 等价于 A & (B & C)
父类型收敛:如果B 是 A的父类型,则A & B 将被收敛成A类型//🔔: 父类型收敛 type A_N = 1 & number // 1 type A_S = 1 & string // '1' type A_B = true & boolean // true
//🔔:父类型收敛的特殊情况 type B = { name: string, age: number } //除never类型外,其它类型与any交叉后,均为any类型 type A_Any_N = 1 & any //any type A_Any_S = '1' & any //any type A_Any_B = true & any //any type A_Any_O = B & any //any //任何与Never类型交叉后,均为never类型 type A_Never_N = 1 & any //any type A_Never_S = '1' & any //any type A_Never_B = true & any //any type A_Never_O = B & any //any
浙公网安备 33010602011771号