Невозможно вызвать объект, который, возможно, «не определен» — Необязательная цепочка, не удаляющая ошибку

#angular #typescript #angular-reactive-forms

#angular #typescript #angular-reactive-forms

Вопрос:

Пытаюсь реализовать пользовательский formcontrol. У меня установлен строгий режим true , и я не хочу его удалять. Реализация функций доступа к управляющему значению все работают с необязательной цепочкой, за исключением setDisabledState . Даже выполнение неявной проверки на возможное значение undefined не устраняет проблему.

Соответствующий код:

 @ViewChild(FormControlDirective, {static: true}) formControlDirective!: FormControlDirective;
@Input() formControl!: FormControl | AbstractControl;

@Input()
formControlName!: string;
get control(): FormControl {
  return (this.formControl || this.controlContainer?.control?.get(this.formControlName)) as FormControl;
}

constructor(private controlContainer: ControlContainer) { }

// .... more code

// ISSUE BELOW!!!
setDisabledState(isDisabled: boolean): void {
  if (this.formControlDirective amp;amp; this.formControlDirective.valueAccessor) {
    this.formControlDirective.valueAccessor.setDisabledState(isDisabled);
  }
}
 

Ошибка:

Cannot invoke an object which is possibly 'undefined'.

Я воспроизвел проблему в этой заметке STACKBLITZ, отключение строгого режима устраняет проблему, и код работает по назначению.

Ответ №1:


setDisabledState является необязательным свойством в ControlValueAccessor интерфейсе: https://angular.io/api/forms/ControlValueAccessor

Следовательно, это может быть не функция.

Вы также можете добавить необязательную цепочку к вызову метода, что должно исправить вашу ошибку:

 this.formControlDirective?.valueAccessor?.setDisabledState?.(isDisabled);
 

Комментарии:

1. О, глупый я, спасибо! Был слишком сосредоточен на formControlDirective.valueAccessor … вместо того, чтобы фактически сосредоточиться на setDisabledState …. туннельном видении: P

2. Нет проблем — простая ошибка, поскольку другие свойства функции не являются необязательными 🙂