代码之家  ›  专栏  ›  技术社区  ›  tru7

在typeguard筛选后从回调访问类的成员

  •  0
  • tru7  · 技术社区  · 6 年前

    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回调中的类栏访问id时,我得到的错误是'Bar | error.'类型上不存在'Property'id'。

    看来在这种情况下,类型后卫失去了他的效力。

    这是预料之中的吗?

    顺便说一句,我不能在这个问题上使用标签类型保护(它不存在,我也没有创建它的声誉,应该创建它吗?)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    6 年前

    类型保护和流分析通常不跨越函数边界。在您的例子中,您传递给 find 不会从任何守卫那里得到好处。使用局部变量的解决方案可能是最简单和最安全的。