2016-10-17 96 views
8

我碰到一些代碼,看起來像這樣走過來:在打字稿中```關鍵字是做什麼的?

export function foo(arg: string): arg is MyType { 
    return ... 
} 

我還沒有蜜蜂能在任何文檔或谷歌搜索is,這是一個很常見的詞,顯示出來基本上在每一頁上。

該關鍵字在該上下文中做了什麼?

回答

5
function isString(test: any): test is string{ 
    return typeof test === 「string」; 
} 

function example(foo: any){ 
    if(isString(foo)){ 
     console.log(「it is a string」 + foo); 
     console.log(foo.length); // string function 
    } 
} 
example(「hello world」); 

使用類型謂語「測試串」在上面的格式(而不是隻使用返回boolean類型),isString()被調用後,如果該函數返回true ,TypeScript會將該類型的範圍縮小到由調用該函數保護的任何塊中的字符串。 編譯器會認爲foo是字符串,在下面的守衛塊(只有在以下把守塊)

{ 
    console.log(「it is a string」 + foo); 
    console.log(foo.length); // string function 
} 

類型謂詞只是在編譯的時候。結果.js文件(運行時)將沒有區別,因爲它不考慮TYPE。

我將在以下四個例子中說明差異。

例1: 上述示例代碼不會有編譯錯誤和運行時錯誤。

例2: 下面的示例代碼會產生編譯錯誤(以及運行時錯誤),因爲TypeScript已將類型縮小爲字符串,並且檢查toExponential不屬於字符串方法。

function example(foo: any){ 
    if(isString(foo)){ 
     console.log(「it is a string」 + foo); 
     console.log(foo.length); 
     console.log(foo.toExponential(2)); 
} 
} 

例如, 3: 下面的示例代碼沒有編譯錯誤,但會產生運行時錯誤,因爲TypeScript只會將該類型的字符串縮小到字符串中,因此foo.toExponential不會創建編譯錯誤(TypeScript不認爲它是一個字符串類型)。但是,在運行時,字符串沒有toExponential方法,所以它會產生運行時錯誤。

function example(foo: any){ 
    if(isString(foo)){ 
     console.log(「it is a string」 + foo); 
     console.log(foo.length); 
} 
console.log(foo.toExponential(2)); 
} 

例如, 4: 如果我們不使用「test is string」(類型謂詞),TypeScript將不會縮小被保護的塊中的類型,下面的示例代碼將不會出現編譯錯誤,但會產生運行時錯誤。

function isString(test: any): boolean{ 
    return typeof test === 「string」; 
} 
function example(foo: any){ 
    if(isString(foo)){ 
     console.log(「it is a string」 + foo); 
     console.log(foo.length); 
     console.log(foo.toExponential(2)); 
} 
} 

的結論是:「測試字符串」(類型謂詞)在編譯的時候是用來告訴開發人員的代碼將有機會擁有運行時錯誤。對於JavaScript,開發人員不會在編譯時知道錯誤。這是使用TypeScript的優勢。

1

我所知道的唯一用途就是你們的榜樣的一個:指定在定義類型衛隊

的用戶「類型斷言」( arg is MyType) 定義類型衛隊

請參閱用戶在此reference

這裏是另一個reference

+1

我也在文檔中看到過這個,奇怪的設計決定是什麼,這種情況完全可以通過返回一個'boolean'類型來處理? – benjaminz

+0

@benjaminz這可能會證明這是它自己的問題,但我可以向你展示它們是如何不同的一個快速例子。 'is'關鍵字實際上是轉換類型,並可以在代碼中稍後捕獲類型錯誤。有關更多信息,請參見[本示例](https://goo.by/WAlvg)。 – styfle

+0

@benjaminz我不明白它是如何被布爾值處理的。 Typescript需要知道傳遞對象的函數的功能類似於警衛。如果它只是返回true或false類型,Typescript如何知道它確實是一個類型警衛,而不是一些隨意的函數,如果對象是真實的,則返回true。如何知道縮小物體的類型?其次,它如何知道用什麼類型來縮小對象的類型?如果參數是三種類型之一,該怎麼辦?它需要知道'true'對應於一個特定的類型。 – pushkin