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

posted on 2024-07-05 14:35  梁飞宇  阅读(70)  评论(0)    收藏  举报