使用TypeScript 1.6,可以编写函数来检查对象的接口 . (以下是MSDN的宣布以及如何使用它 . )
我的问题针对的是返回表达式 return a.name === 'kitty';
:
-
扮演一个角色?
-
所有猫都必须叫kitty吗?
用户定义的类型保护[http://blogs.msdn.com/b/typescript/archive/2015/09/16/announcing-typescript-1-6.aspx]在早期版本的TypeScript中,您可以使用if语句缩小类型 . 例如,您可以使用:if(typeof x ===“number”)这有助于将信息流输入到运行时使用类型的常用方法(受到一些其他正在进行类型检查的项目的启发) . 虽然这种方法很强大,但我们希望进一步推进它 . 在1.6中,您现在可以创建自己的类型保护功能:interface Animal {name:string; }
接口Cat扩展Animal {
喵();
}
function isCat(a:Animal):a是Cat {
返回a.name ==='kitty';
}
var x:动物;
if(isCat(x)){
x.meow(); //好的,x在这个区块中是Cat
}
这使您不仅可以使用typeof和instanceof检查,这需要JavaScript理解的类型,但现在您可以使用接口并进行自定义分析 . Guard函数由它们的“a is X”返回类型表示,如果现在的预期类型是什么,它将返回布尔值并向编译器发送信号 .
2 回答
考虑你的例子
此示例显示,现在,我们可以使用类似
a is Cat
的表达式,并且在已经使用了检查的后续块中,a
的类型将是Cat
. 您可以替换的return a.name === 'kitty';
表达式这将是工作 .
即使你也可以用它替换它
我为你准备了example,你可以玩它 .
Conclusions:
表达式
a is Cat
提供与a instanceof SomeClass
相同的效果,但第一个是可自定义检查而不是最后一个,最后一个不适用于接口 .您的检查功能可以包含任何代码 - 这是您的选择
这个未来让我们有可能检查 if instance is inctanceof interface
更新
扮演一个角色?
是的,它起作用 .
a.name === 'kitty'
- 这个表达式显示检查给定动物的逻辑 IS -Cat
,所以,在这里你可以提供任何boolean
表达式,检查给定的动物是Cat
,即使你只能返回true
或false
;所有猫都必须叫kitty吗?
不,这取决于你 . 在函数
isCat
中,您可以提供任何确保 given animal类型为Cat
的逻辑关于
return a.name === 'kitty';
的问题:1)它是否起作用?
是的,返回值确定类型保护是通过还是失败 .
2)所有猫都必须叫kitty吗?
是的,在这种情况下,所有猫必须被称为Kitty .
它归结为什么,这不是一个很好的例子 .
一个更好的将是......
看JSFiddle https://jsfiddle.net/penguin020/kwuf6yga/