2017-02-09 40 views
0

我正在閱讀Typescript手冊中的User-Defined Type Guards。假設你有要縮小如下的聯合類型:替代方法使用用戶定義的類型警衛?

interface Bird{ 
    fly(); 
    layEggs(); 
} 

interface Fish{ 
    swim(); 
    layEggs(); 
} 

class SmallPet implements Fish,Bird{ 
    constructor(){ 
    } 
    fly() { console.log("fly")}; 
    swim() { console.log("swim")}; 
    layEggs() {console.log("laying eggs") }; 
} 

function getSmallPet(): Fish | Bird{ 
    return new SmallPet(); 
} 

function isFish(pet: Fish | Bird): pet is Fish{ 
    return (<Fish>pet).swim !== undefined; 
} 

let pet = getSmallPet(); 

if (isFish(pet)) 
    pet.swim(); //works 

功能isFish是一個用戶定義的類型衛隊在手冊中提到。我的問題是如何工作?我試圖達到同樣的效果更草率的方式,這不是明顯的去上班:

pet is Fish; 
pet.swim(); //doesn't work 

不打字稿已經解析,看起來像一個後衛類型的函數來實現該功能,然後縮小範圍函數調用的類型?有沒有其他的方式來保護警衛隊?

回答

1

用戶定義類型衛士有兩個功能:

  1. 檢查在運行時的值是否是某種類型的
  2. 告訴編譯器的值是某種類型的

如果你知道你的實例是Fish型,那麼你可以簡單地:

(pet as Fish).swim(); 

而在你的情況,你也可以使用instanceof型後衛:

if (pet instanceof SmallPet) { 
    pet.swim(); 
} 
1

guide

A型後衛是一些表達式執行運行時檢查,保證在一定範圍內的類型。

所以,當你使用類型控衛,類型檢查器將縮小實例的當前作用域類型:if塊在這種情況下

相同的操作可以在如果使用pet instanceof Fish完成聲明。類型檢查器對當前範圍進行相同類型的縮小。