2017-11-11 121 views
2

我正在尝试使用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断言运算符更好的方法?

回答

2

它看起来像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

+0

我最终为自己编写了自己的帮助器方法具体的用例。谢谢你的指导和帮助......它肯定有帮助。在附注中,这个问题很快就会被解决。 https://github.com/angular/angular/pull/20040 – calbear47

+0

很高兴帮助。在pull请求登陆后,你仍然需要帮助你的帮助者,它只是增加了泛型支持 - “AbstractControl.get()”的结果仍然是可空的。 –