我在循环内的三元运算符中使用 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 .. of 循环中,我使用我的类型保护将我当前的项目或 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;
}
我的问题
- 这是设计使其中一个有效而另一个无效吗?
- 如果按照设计,这里的细微差别决定了它何时起作用?特别是为什么将我的对象分配给一个新变量(没有任何类型更改)会消除编译器错误?