Angular 为什么我的;如果;块无法在Typescript中充当typeguard?

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('') }

我正试图用Angular 4.4.6和Typescript 2.4.2编写一个应用程序。将“strictNullChecks”编译器选项设置为true

在component类的顶部,我为如下表单声明了一个属性:

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()
的结果仍然可以为空。