交叉型別與聯合型別 第三節
阿新 • • 發佈:2020-11-24
交叉型別
將多個型別合併為一個型別, 新型別具有所有型別的特性
名稱上看 交叉型別是取兩個型別的交集,但這裡其實是取型別的並集
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: '吃'}))