Angular FormArray ValidatorFn не компилирует Typescript - PullRequest
0 голосов
/ 05 августа 2020

Я получаю следующие ошибки Typescript с помощью указанного ниже метода проверки. Чувствую, все перепробовал, и у меня нет идей. Может ли кто-нибудь сказать мне, как решить проблему?

Метод валидатора не позволяет проекту компилироваться, и поэтому проблема не связана с использованием метода.

Type '(formArray: FormArray) => { required: boolean; } | null' is not assignable to type 'ValidatorFn'.
      Types of parameters 'formArray' and 'control' are incompatible.
        Type 'AbstractControl' is missing the following properties from type 'FormArray': controls, at, push, insert, and 6 more.
public static minSelectedCheckboxes(min: number = 1): ValidatorFn {
    const validator: ValidatorFn = (formArray: FormArray) => {
   
      const totalSelected = formArray.controls
        // get a list of checkbox values (boolean)
        .map((control) => control.value)
        // total up the number of checked checkboxes
        .reduce((prev, next) => (next ? prev + next : prev), 0);

      // if the total is not greater than the minimum, return the error message
      return totalSelected >= min ? null : { required: true };
    };

    return validator;
  }

Метод взят из этого примера, который компилируется, но использует compilerOptions.strict = false, что неприемлемо. https://coryrylan.com/blog/creating-a-dynamic-checkbox-list-in-angular

Пример в Stackblitz находится здесь: https://stackblitz.com/edit/angular-98wn2v (вилка приведенного выше примера с compilerOptions.strict = true)

1 Ответ

0 голосов
/ 05 августа 2020

ValidatorFn ожидает тип AbstractControl в качестве первого параметра, но вы передаете FormArray, который является производным классом.

Это будет работать, как ожидалось:

function minSelectedCheckboxes(min = 1) {
  const validator: ValidatorFn = (formArray: AbstractControl) => {
    if (formArray instanceof FormArray) {
      const totalSelected = formArray.controls
        .map((control) => control.value)
        .reduce((prev, next) => (next ? prev + next : prev), 0);
      return totalSelected >= min ? null : { required: true };
    }

    throw new Error('formArray is not an instance of FormArray');
  };

  return validator;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...