2016-01-20 58 views
0
interface Initializing { 
    progress: number; 
} 

var isInitializing = (x: any): x is Initializing => { 
    return typeof x.progress === 'number'; 
} 

上面的代碼可以編譯沒有任何錯誤。typescript守衛在方法聲明

我的問題與代碼中的「:x is Initializing」子句有關。它似乎不會影響生成的JavaScript。

什麼「:x正在初始化」子句用於?什麼樣的類型檢查完成?當我使用任何參數調用函數「isInitializing」時,它似乎生成相同的代碼。它產生相同的JS代碼。

示例非常感謝。

回答

1

這是一個user defined type guard。它不會生成任何代碼,但是當函數與if語句一起使用時,編譯器會自動將傳入的對象視爲if語句中is子句中指定的類型。

下面是一個例子:

interface Initializing { 
    progress: number; 
} 

var isInitializing = (x: any): x is Initializing => { 
    return typeof x.progress === 'number'; 
} 

var obj = { progress: 1 }; 

// obj is type "{ progress: number; }" here  

if (isInitializing(obj)) { 
    obj; // obj is type "Initializing" within this if statement 
} 

// obj is type "{ progress: number; }" here