打字稿严格。 state属性未定义

时间:2018-02-06 17:46:08

标签: typescript strict

class AClass{
    aProp?:number=undefined;
    HasAProp():boolean{return this.aProp!==undefined;}
}
let anInst=new AClass;
if (anInst.aProp)     // standard check
    Math.sqrt(anInst.aProp);

if (anInst.HasAProp())    // custom check
    Math.sin(anInst.aProp);     // ts error:  Argument of type 'number | undefined' is not assignable to parameter of type 'number'.

在严格模式下,typescript会警告可能未定义的属性的使用。令人惊讶的是,它能够检测出阻止它的逻辑(正如在评论中所做的那样"标准检查"。

但如果逻辑更隐蔽,就像在"自定义检查"它没有。我不希望它是超级聪明的,但是什么方式表明该财产已经过验证? (这个例子很简单,但在更复杂的情况下可能是必要的)

2 个答案:

答案 0 :(得分:2)

您可以使用is

class AClass {
    aProp?: number = undefined;
    HasAProp(aProp: this['aProp']): aProp is number {
        return aProp !== undefined;
    }
}

let anInst = new AClass;
if (anInst.aProp)
    Math.sqrt(anInst.aProp);

if (anInst.HasAProp(anInst.aProp))
    Math.sin(anInst.aProp);

我不确定是否可以将aProp作为参数传递给HasAProp()

答案 1 :(得分:2)

在这种情况下,TypeScript编译器无法确定该属性不是nullundefined,您可以使用!(非空断言运算符)。

在你的情况下,这意味着:

if (anInst.HasAProp(anInst.aProp))
    Math.sin(anInst.aProp!);

这有效地告诉编译器您知道此时已定义属性,即使编译器无法解决该问题。

此处提供更多信息:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html