2015-09-22 55 views
2

使用TypeScript 1.6可以編寫函數來根據接口檢查對象。 (下面是從MSDN的anncouncement以及如何使用它。)用戶定義的類型警衛[打字稿]

我的問題主攻​​返回表達式return a.name === 'kitty';

  1. 播放它的作用是什麼?
  2. 必須所有的貓都叫貓咪嗎?

用戶定義類型警衛

[http://blogs.msdn.com/b/typescript/archive/2015/09/16/announcing-typescript-1-6.aspx]

在早期版本的打字稿的,你可以if語句 縮小型使用。例如,你可以使用:

if (typeof x === "number") { … }

這有助於鍵入信息流與在運行時 類型(由一些其他項目做 類型檢查JS的啓發)工作的常用方法。雖然這種方法非常強大,但我們希望 可以進一步推進。在1.6,您現在可以創建自己的類型後衛 功能:

interface Animal {name: string; } 
interface Cat extends Animal { 
    meow(); 
} 

function isCat(a: Animal): a is Cat { 
    return a.name === 'kitty'; 
} 

var x: Animal; 

if(isCat(x)) { 
    x.meow(); // OK, x is Cat in this block 
} 

這可以讓你不僅typeof運算和instanceof檢查工作, 這需要一個JavaScript能夠理解一個類型,但現在你可以工作 與接口並進行自定義分析。保護函數被表示爲 ,它們的「a是X」返回類型,如果現在的預期類型是什麼,則返回布爾值和信號給編譯器。

+0

另一個例子可以找到[這裏](http://stackoverflow.com/questions/32680394/how-to-預防/ assiging-similar-types/32680710#32680710) – thoughtrepo

+0

順便說一句,這似乎是一個更清晰的例子:[TS Deep Dive](https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard。 html),特別是'isFoo'。 – superjos

回答

3

考慮您的例子

interface Animal {name: string; } - an interface 
interface Cat extends Animal { - an implementation 
    meow(); 
} 

function isCat(a: Animal): a is Cat { 
    return a.name === 'kitty'; // your special checking you can replace it with any other checking expression 
} 

var x: Animal; 

if(isCat(x)) { 
    x.meow(); // OK, x is Cat in this block 
} 

這個例子顯示,現在,我們可以使用類似的表達和a is Cat在後續塊,其中,檢查已被使用的a型將是Cat。您可以用

function isCat(a: Animal): a is Cat { 
    return a["meow"] != undefined; // it also would be indicate that the animal is Cat 
} 

替換的return a.name === 'kitty';表達式,這將是工作。

即使你可以用這個太

function isCat(a: Animal): a is Cat { 
     return true; 
} 

我已經準備example爲您更換它,你可以用它玩。

結論:

  1. 表達a is Cat提供相同的效果a instanceof SomeClass,但第一個是可定製的檢查,而不是最後一個,也是最後一個不與接口工作。
  2. 你的檢查功能可以包含任何代碼 - 它是你的選擇
  3. 這未來給我們的可能性,以檢查如果實例inctanceof 接口

更新

  1. 播放它的角色?
    • 是的,它播放。 a.name === 'kitty' - 這個表達式顯示檢查給動物IS的邏輯 - Cat,所以,在這裏你可以提供任何boolean表達式檢查給動物Cat甚至可以返回剛剛truefalse;
  2. 必須所有的貓叫的小貓?
    • 號它是由你。在功能isCat您可以提供保證給出動物類型的Cat
2

你就return a.name === 'kitty';問題的任何邏輯:

1)是否發揮了作用?
是的,返回值決定了類型守衛是否通過或失敗。

2)必須所有的貓都叫貓咪嗎?
是的,在這種情況下,所有的貓都必須叫Kitty。

它是什麼,它不是一個很好的例子。

一個更好的人會...

class Animal {name: string; type: string; } 
class Cat extends Animal { 
    type: string = "Cat"; 
    meow() {}; 
} 

function isCat(a: Animal): a is Cat { 
    return a.type === 'Cat'; // your special checking you can replace it with any other checking expression 
} 

var x: Animal = new Cat(); 

if(isCat(x)) { 
    x.meow(); // OK, x is Cat in this block 
} 

看到的jsfiddle https://jsfiddle.net/penguin020/kwuf6yga/