我在循环内的三元运算符中使用TypeScript类型保护,并看到我不理解的行为。
我的界面
interface INamed {
name: string;
}
interface IOtherNamed extends INamed {
otherName: string;
}
我的打样后卫
function isOther(obj: any): obj is IOtherNamed {
... // some check that returns boolean
}
一般用法示例
var list: Array<{named: INamed}> = [];
for(let item of list) {
var other: IOtherNamed = ...
}
在我的for循环中,我正在使用我的类型保护器将当前项目或null分配给IOtherNamed变量。
这不起作用
// Compiler Error: INamed is not assignable to IOtherNamed
for(let item of list) {
var other: IOtherNamed = isOther(item.named) ? item.named : null;
}
这样做
for(let item of list) {
var named: INamed = item.named;
var other2: IOtherNamed = isOther(named) ? named : null;
}
我的问题
答案 0 :(得分:4)
是的,这是针对TypeScript&lt; 2.0:
请注意,类型保护仅影响变量和参数的类型,并且对属性等对象的成员没有影响。
- 4.20来自语言规范(PDF,第83页)
因此,它在第二种情况下工作的原因是因为您已将属性分配给变量,然后键入保护该变量。
更新:正如Alex指出的那样,TypeScript 2.0将支持属性上的类型保护。