2015-09-22 52 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/