TypeScript版本3.0.1
请参阅此示例:
class Bar{
public id ='bar';
}
function createABar():Bar|Error{
return new Bar();
}
function check(){
let aGlobal = createABar();
if (aGlobal instanceof Bar){
let aGlobal2=aGlobal;
let arr=['one', 'bar', 'three'];
let theAGlobalId=aGlobal.id; // ts no complaints
let exists = arr.find(i => i == aGlobal.id); // ts Property 'id' does not exist on type 'Bar | Error'.
console.log(exists); // it has been found (as expected)
// alternate syntax:
let exists2 = arr.find(function (i){return i == aGlobal.id}); // ts Property 'id' does not exist on type 'Bar | Error'.
let exists3 = arr.find(i => i == aGlobal2.id); // ts no complaints
}
}
check();
我收到错误信息“酒吧|错误'。'从find的回调中的Bar类访问ID时。
在这种情况下,类型防护似乎失去了效力。
将“ typeguarded”变量分配给另一个(aGlobal2)可行
这是预期的吗?
顺便说一句,我不能在这个问题中使用标签保护器(它不存在,我没有创建它的声誉,应该创建它吗?)
答案 0 :(得分:1)
Typeguard和流程分析通常不会跨越功能边界。在您的情况下,您传递给find
的匿名函数将不会从任何保护措施中受益。使用局部变量的解决方案可能是最简单,最安全的方法。