Почему Angular AoT не поддерживает выражения функций в декораторах?

Angular AoT-компилятор выдает ошибку, если вы попытаетесь сделать вызов в декораторе.

рассмотрим следующий код:

export function factoryBuilder(config: MyConfig) {
  return function customFactory() {
    return new MyService(config);
  };
}

@NgModule({})
export class MyModule {

  static forRoot(config: MyConfig): ModuleWithProviders {

    return {
      ngModule: MyModule,
      providers: [
        {
          provide: MyService,
          useFactory: factoryBuilder(config),
        }]
    };
  }
}

Если вы попытаетесь собрать его с флагом aot (--prod):

Компилятор говорит:

ERROR in Error during template compile of 'AppModule'
  Function expressions are not supported in decorators in 'MyModule'
   ...
    Consider changing the function expression into an exported function.

Может кто-нибудь технически объяснить, почему компилятор не может это поддерживать?

PS: этот код работает в режиме JiT.

1 ответ

Функции стрелок (или лямбда-выражения) не поддерживаются в модулях, поскольку компилятор AOT должен анализировать модуль "статически".

Используя нормальный function вместо функции стрелка должна решить проблему:

export function myFactory(config) { };

Вы также можете сделать то же самое с customFactory функция, возвращаемая myFactory,

Вы можете найти больше информации о том, как AOT работает, в официальном руководстве или в этом шпаргалке.

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