我碰到一些代碼,看起來像這樣走過來:在打字稿中```關鍵字是做什麼的?
export function foo(arg: string): arg is MyType {
return ...
}
我還沒有蜜蜂能在任何文檔或谷歌搜索is
,這是一個很常見的詞,顯示出來基本上在每一頁上。
該關鍵字在該上下文中做了什麼?
我碰到一些代碼,看起來像這樣走過來:在打字稿中```關鍵字是做什麼的?
export function foo(arg: string): arg is MyType {
return ...
}
我還沒有蜜蜂能在任何文檔或谷歌搜索is
,這是一個很常見的詞,顯示出來基本上在每一頁上。
該關鍵字在該上下文中做了什麼?
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的優勢。
我也在文檔中看到過這個,奇怪的設計決定是什麼,這種情況完全可以通過返回一個'boolean'類型來處理? – benjaminz
@benjaminz這可能會證明這是它自己的問題,但我可以向你展示它們是如何不同的一個快速例子。 'is'關鍵字實際上是轉換類型,並可以在代碼中稍後捕獲類型錯誤。有關更多信息,請參見[本示例](https://goo.by/WAlvg)。 – styfle
@benjaminz我不明白它是如何被布爾值處理的。 Typescript需要知道傳遞對象的函數的功能類似於警衛。如果它只是返回true或false類型,Typescript如何知道它確實是一個類型警衛,而不是一些隨意的函數,如果對象是真實的,則返回true。如何知道縮小物體的類型?其次,它如何知道用什麼類型來縮小對象的類型?如果參數是三種類型之一,該怎麼辦?它需要知道'true'對應於一個特定的類型。 – pushkin