为什么我的“If”块无法在打字稿中作为打字员?
问题描述:
我正在尝试使用Angular 4.4.6和Typescript 2.4.2编写应用程序。将“strictNullChecks”编译器选项设置为true。为什么我的“If”块无法在打字稿中作为打字员?
在我的组件类的顶部,我声明一个属性的表单,像这样:
BasicForm: FormGroup | null;
然后我初始化我在OnInit
生命周期挂钩的形式。像这样:
ngOnInit(){
this.BasicForm = new FormGroup({
name : new FormControl('')
});
}
问题
当我试图引用我的形式,一类方法,编译器会骂我,说“对象可能是空” ......这让我困惑,因为我将引用包装在一个检查为空的if块中。
myMethod(){
if(this.BasicForm){
let name = this.BasicForm.get('name').value;
}
}
为了解决这个问题,我有我的访问值property.Like所以前添加非空断言操作:
myMethod(){
if(this.BasicForm){
let name = this.CampgroundForm.get('name')!.value;
}
}
但我不喜欢用这个......这似乎对TS想要实现的东西产生反作用。
为什么不用这个控制器控制流量分析?有没有比添加非null断言运算符更好的方法?
答
它看起来像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;
}
如果你要做很多事情,那么研究一些帮助你避免空检查的数据类型可能是有用的:https://github.com/cbowdon/TsMonad#general-maybe-usage
我最终为自己编写了自己的帮助器方法具体的用例。谢谢你的指导和帮助......它肯定有帮助。在附注中,这个问题很快就会被解决。 https://github.com/angular/angular/pull/20040 – calbear47
很高兴帮助。在pull请求登陆后,你仍然需要帮助你的帮助者,它只是增加了泛型支持 - “AbstractControl.get()”的结果仍然是可空的。 –