错误 TS2531 对象在角度反应形式中可能为空

man*_*dan 12 typescript angular

嗨,我尝试在 angular 11 中进行反应式表单验证,但它在终端中显示以下错误。

错误 TS2531 对象可能为空。

我在 signup.component.ts 中的代码

import {FormGroup, FormControl, Validators} from '@angular/forms';
        
form =  new FormGroup({
    firstName: new FormControl('',Validators.required)
})
    
get f()
{
    return this.form.controls;
}
Run Code Online (Sandbox Code Playgroud)

在 signup.component.html 中

<form role="form" [formGroup]="form">
    <div class="form-group">
        <label>Name</label>
        <input type="text" name="name" class="form-control" formControlName="firstName" [ngClass]="{'is-invalid':form.get('firstName').touched && form.get('firstName').invalid}">
        <div *ngIf="f.firstName.touched && f.firstName.invalid">
            <small class="text-danger" *ngIf="f.firstName.errors.required">
                Name is required!
            </small>
            
        </div>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

当我运行它的显示错误时

<小班= “TEXT-危险” * ngIf = “f.firstName.errors。需要”>名称是必需的!

错误 TS2531 对象可能为空。

mbo*_*jko 30

该对象f.firstName.errors可以为空。使用安全导航操作符?

*ngIf="f.firstName.errors?.required"
Run Code Online (Sandbox Code Playgroud)

  • 或者`f.firstName.hasError('required')`或`f.hasError('required', 'firstName')`。 (2认同)

小智 9

最新版本的 Angular 要求您在第一个 if 检查中使用安全导航操作符,例如。

*ngIf="f.firstName?.touched && f.firstName?.invalid"
Run Code Online (Sandbox Code Playgroud)

然后最后

*ngIf="f.firstName.errors?.required"
Run Code Online (Sandbox Code Playgroud)


小智 8

对于角度版本^14.0,可以使用:

form.controls['firstName'].errors?.['required']
and 
form.controls['firstName'].errors?.['minlength']
Run Code Online (Sandbox Code Playgroud)