Angular 为什么我的;如果;块无法在Typescript中充当typeguard?
我正试图用Angular 4.4.6和Typescript 2.4.2编写一个应用程序。将“strictNullChecks”编译器选项设置为true 在component类的顶部,我为如下表单声明了一个属性:Angular 为什么我的;如果;块无法在Typescript中充当typeguard?,angular,typescript,Angular,Typescript,我正试图用Angular 4.4.6和Typescript 2.4.2编写一个应用程序。将“strictNullChecks”编译器选项设置为true 在component类的顶部,我为如下表单声明了一个属性: BasicForm: FormGroup | null; 然后我在OnInitlifecyclehook中初始化表单。像这样: ngOnInit(){ this.BasicForm = new FormGroup({ name : new FormControl('') }
BasicForm: FormGroup | null;
然后我在OnInit
lifecyclehook中初始化表单。像这样:
ngOnInit(){
this.BasicForm = new FormGroup({
name : new FormControl('')
});
}
问题
当我试图在类方法中引用我的表单时,编译器会对我大喊大叫,说“Object可能为null”……这让我很困惑,因为我将引用包装在一个if块中,该块检查null
myMethod(){
if(this.BasicForm){
let name = this.BasicForm.get('name').value;
}
}
为了解决这个问题,我必须在访问我的value属性之前添加一个非null断言运算符。如下所示:
myMethod(){
if(this.BasicForm){
let name = this.CampgroundForm.get('name')!.value;
}
}
但我不喜欢用这个…这似乎是适得其反的TS是试图实现
为什么我的typeguard不能在这里进行控制流分析?有比添加非空断言运算符更好的方法吗?看起来
null
警告实际上是在BasicForm.get()的结果上出现的
这样做可能会有点难看:
myMethod(){
if(this.BasicForm){
let prop = this.BasicForm.get('name');
if (prop){
let name = prop.value;
}
}
}
或者,您可以尝试添加包装空检查逻辑的帮助器方法:
myMethod(){
let name = this._formGet('name');
if(name){
// do stuff with name
}
}
_formGet(prop){
let result;
if(this.BasicForm){
let prop = this.BasicForm.get('name');
if (prop){
result = prop.value;
}
}
return result;
}
如果您打算经常做这类事情,那么了解一些帮助您避免空检查的数据类型可能会很有用:我最终为自己的特定用例编写了自己的helper方法。谢谢你的指导和帮助……这当然有帮助。另一方面,这个问题看来很快就会得到解决。很高兴这有帮助。在拉取请求到达后,您仍然需要保留助手,它只是添加了泛型支持,AbstractControl.get()
的结果仍然可以为空。