Angular 15 — FormsBuilder — TypeError: невозможно прочитать свойства неопределенного (чтение «группы»)

Я перенес свой проект на Angular 15 и больше не могу напрямую использовать FormsBuilder для реактивных форм. Я получаю неопределенное исключение:

ERROR Error: Uncaught (in promise): TypeError: Cannot read properties of undefined (reading 'group')
TypeError: Cannot read properties of undefined (reading 'group')

Это мой код:

 settingsForm = this.formBuilder.group({
    locations: ''
  });

  constructor(private formBuilder: FormBuilder) {}

Раньше все работало нормально. Работающее решение — через хук жизненного цикла NgOnInit. Однако это был бы нерекомендуемый способ, и я теряю свою неявную типизацию.

Что может быть причиной?

Вы уверены, что это место вашей ошибки? Вот Stackblitz этой работы в Angular 15.

D M 12.12.2022 18:06

Если я сброшу все в NgOnInit, все сработает. Я не знаю, что еще может быть причиной проблемы.

Gregor Biswanger 12.12.2022 19:38

У меня теперь работает прямое создание экземпляров: settingsForm = new FormBuilder().nonNullable.group({...}); - Однако странно, почему не работает DI и конструктор. Я тоже не смог воспроизвести ошибку.

Gregor Biswanger 12.12.2022 23:48
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
207
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причиной вашей проблемы является переключатель tsconfig useDefineForClassFields.

Когда это включено, классы инициализируются, как определено в стандарте ecma, где порядок инициализации немного отличается от машинописного текста. См. также примечания к выпуску TS 3.7

Итак, когда это включено, поле settingsForm инициализируется перед сокращением конструктора.

Из моего исследования я полагаю, что это будет поведение по умолчанию в будущих версиях машинописного текста, поэтому вы должны соответствующим образом реорганизовать свой код.

// useDefineForClassFields = true
"use strict";
class Test {
    foo;
    bar = this.foo;
    constructor(foo) {
        this.foo = foo;
        console.info(this.foo, this.bar);
    }
}
const x = new Test('abc');
// useDefineForClassFields = false
"use strict";
class Test {
    constructor(foo) {
        this.foo = foo;
        this.bar = this.foo;
        console.info(this.foo, this.bar);
    }
}
const x = new Test('abc');

Сгенерировано на TS Playground

Интересный! Просто странно, что я не могу воспроизвести его с новым приложением Angular 15, и проблема возникла только при переносе моего приложения Angular 14 -> 15. Я изменил свой код и оставил его как есть. Я по-прежнему буду рад проверить вашу конфигурацию TS позже, чтобы убедиться, что проблема в ней.

Gregor Biswanger 13.12.2022 18:38

Другие вопросы по теме