Доступ к члену класса из обратного вызова после фильтрации типа - PullRequest
0 голосов
/ 30 августа 2018

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 в этом вопросе (он не существует, и у меня нет репутации, чтобы его создавать, нужно ли его создавать?)

1 Ответ

0 голосов
/ 30 августа 2018

Тип защиты и анализ потока в целом не пересекают границы функций. В вашем случае анонимная функция, которую вы передаете find, не будет пользоваться ни одним из охранников, которые были выполнены. Решение использовать локальную переменную, вероятно, самое простое и безопасное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...