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会警告可能未定义的属性的使用。令人惊讶的是,它能够检测出阻止它的逻辑(正如在评论中所做的那样"标准检查"。
但如果逻辑更隐蔽,就像在"自定义检查"它没有。我不希望它是超级聪明的,但是什么方式表明该财产已经过验证? (这个例子很简单,但在更复杂的情况下可能是必要的)
答案 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编译器无法确定该属性不是null
或undefined
,您可以使用!
(非空断言运算符)。
在你的情况下,这意味着:
if (anInst.HasAProp(anInst.aProp))
Math.sin(anInst.aProp!);
这有效地告诉编译器您知道此时已定义属性,即使编译器无法解决该问题。
此处提供更多信息:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html