使用 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") { … }
这有助于类型信息流入运行时处理类型的常用方法(受到其他一些进行 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 可以理解的类型,而且现在您可以使用接口并进行自定义分析。Guard 函数由它们的“a is X”返回类型表示,如果预期类型现在是什么,它会返回布尔值并向编译器发出信号。