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();
Я получаю сообщение об ошибке. «Идентификатор объекта» не существует для типа «Bar | Ошибка'.' при обращении к id из класса Bar внутри функции обратного вызова find.
Похоже, что в этом случае охранник типа теряет свою эффективность.
Назначение переменной «typeguarded» другой (aGlobal2) работает
Ожидается ли это?
Кстати, я не смог использовать тег typeguard в этом вопросе (он не существует, и у меня нет репутации, чтобы его создавать, нужно ли его создавать?)