使用TypeScript 1.6可以编写函数来检查对象的接口。 (以下是MSDN的宣布以及如何使用它。)
我的问题针对返回表达式 return a.name === 'kitty';
:
用户定义的类型保护
[http://blogs.msdn.com/b/typescript/archive/2015/09/16/announcing-typescript-1-6.aspx]
在早期版本的TypeScript中,您可以使用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 is X”返回类型,它返回布尔值和信号 编译器,如果现在的预期类型是什么。
答案 0 :(得分: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
。可以用
return a.name === 'kitty';
表达式
function isCat(a: Animal): a is Cat {
return a["meow"] != undefined; // it also would be indicate that the animal is Cat
}
这将是有效的。
即使你也可以用它替换它
function isCat(a: Animal): a is Cat {
return true;
}
我为你准备了example,你可以玩它。
结论:
a is Cat
提供与a instanceof SomeClass
相同的效果,但第一个是自定义检查而不是最后一个,最后一个不适用于接口。a.name === 'kitty'
- 此表达式显示检查给定动物 IS - Cat
的逻辑,因此,您可以在这里提供检查给定动物的任何boolean
表达式Cat
即使您只能返回true
或false
; isCat
中,您可以提供任何逻辑,以确保 给定 动物的类型为Cat
答案 1 :(得分: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/