无法实现 ValidatorFn 接口

Wal*_*bär 8 javascript typescript angular

我想使用 Angular 的接口实现自定义跨字段验证器ValidatorFn

这是我的代码:(我按照https://angular.io/guide/form-validation#cross-field-validation上提供的步骤进行操作)

import { ValidatorFn, ValidationErrors, FormGroup } from "@angular/forms";

/**
* This validator implements the ValidatorFn Interface from Angular. 
* 
* @param formGroup- the FormGroup that needs Validation
* 
* @returns null if the form is valid, else some {@link ValidatorErrors}
*/
export const CompleteBloodpressureValidator: ValidatorFn = (formGroup: FormGroup) => {

    const bloodpressureSys = formGroup.get("bloodPressureSysFormControl");
    const bloodpressureDia = formGroup.get("bloodPressureDiaFormControl");

    if (bloodpressureSys != null && bloodpressureDia == null || bloodpressureSys == null && bloodpressureDia != null){
        // return some custom ValidatorErrors
        return {
            bloodPressureIncomplete: true
        };
    }
    // if everything is fine, return null
    return null;
 }
Run Code Online (Sandbox Code Playgroud)

但角度编译器不断告诉我以下内容:

Type '(fromGroup: FormGroup) => { bloodPressureIncomplete: boolean; } | null' is not assignable to type 'ValidatorFn'.

Types of parameters 'fromGroup' and 'control' are incompatible.

Type 'AbstractControl' is missing the following properties from type 'FormGroup': controls, registerControl, addControl, removeControl, and 3 more.ts(2322)
Run Code Online (Sandbox Code Playgroud)

在我看来这没有任何意义,我的实现ValidatorFn正是它应该的样子。

有什么建议我在这里做错了什么吗?

Wal*_*bär 12

So the answer to this question is to update the TypeScript version or exchange

formGroup: FormGroup
Run Code Online (Sandbox Code Playgroud)

with

formGroup: AbstractControl
Run Code Online (Sandbox Code Playgroud)

It seems to be caused by a bug in the TypeScript version.

编辑:更新到最新的 TypeScript 版本不会改变任何内容。我想这可能是 Angular 文档中的一个错误。

  • 不幸的是,在使用 TypeScript `4.3.5` 和严格模式的 Angular 12 项目中,使用 `FormGroup` 进行操作的唯一选择确实是使用 `formGroup: AbstractControl`,然后每当 `FormGroup` 字段或方法是时使用 `formGroup as FormGroup`。将被使用,例如`(formGroup as FormGroup).controls`。 (3认同)
  • FormGroup 是 AbstractControl 的一个实例,因为 FormGroup 扩展了 AbstractControl。最基本的继承。另外,我已经在我的第一篇文章中粘贴了这个链接,这表明使用 FormGroup 应该没问题:https://angular.io/guide/form-validation#adding-cross-validation-to-reactive-forms (2认同)