1. 程式人生 > 實用技巧 >交叉型別與聯合型別 第三節

交叉型別與聯合型別 第三節

交叉型別

將多個型別合併為一個型別, 新型別具有所有型別的特性

名稱上看 交叉型別是取兩個型別的交集,但這裡其實是取型別的並集

interface DogInterface{
    name: string,
    run(): void
}
interface CatInterface{
    age: number,
    jump(): void
}
// 交叉型別必須滿足所有型別
let pet: DogInterface & CatInterface = {
    name: '',
    age: 1,
    jump: ()=>{},
    run: ()=>{},
}

聯合型別

當宣告的型別並不確定,可能是多個型別中的一個

名稱上看 聯合型別是兩個型別的並集, 但這裡是取型別的交集

// 字面量聯合型別
// 有時候我們不僅要限制一個變數的型別 而且要限定到 某個具體的範圍內
let a: number | string = ''
let b: 'a' | 'b' | 'c' = 'c'
let c: 1 | 2 | 3 = 2
// 繼續以上面的介面型別為例
// 聯合型別必須完全滿足其中一個型別如: name run() |  age jump()
let pet: DogInterface | CatInterface = {
    name: '',
    run: ()=>{},
}
// 我們繼續看下面的例子
interface DogInterface{
  run(): void
  eat(): void
}
interface CatInterface{
  jump(): void
  eat(): void
}
class Dog implements DogInterface{
    run(){}
    eat(){}
}
class Cat implements CatInterface{
    jump(){}
    eat(){}
}
enum Master { Boy, Girl }
function getPet(master: Master){
    let pet = master === Master.Boy ? new Dog() : new Cat();
    // 使用聯合型別時 在型別不確定的情況下那麼它只能取 型別的共有成員 eat
    pet.eat()
    // 型別保護
    if(pet instanceof Dog){
        pet.run()
    }else{
        pet.jump()
    }
    return pet;
}

// 聯合型別 通常利用共有的屬性來建立 型別保護區塊

interface Dog {
    name: 'xiaogou',
    age: number
}
interface Cat{
    name: 'xiaomao',
    color: string
}
interface Pig{
    name: 'xiaozhu',
    hobby: string 
}
type Animal = Dog | Cat | Pig;
/* 當我們函式中併為校驗 pig時返回 undefined 但沒有報錯
   通過兩種方式進行解決:
    1、定義返回值型別   如:function animal():string{} 當返回值為undefined時提示錯誤
    2、定義never型別  當default 是never型別時,說明之前定義無效,需要檢查錯誤
*/
function animal(params: Animal) {
    switch (params.name) {
        case 'xiaogou':
            return '我兩歲了'
            break;
        case 'xiaomao':
            return '我是黃色的'
            break;
        default: 
            return ((e: never) => { throw new Error(e) })(params);     
    }
}
console.log(animal({ name: 'xiaozhu', hobby: '吃'}))