Почему 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 работает, в официальном руководстве или в этом шпаргалке.