Javascript 为什么角度AoT不';t支持decorators中的函数表达式?

Javascript 为什么角度AoT不';t支持decorators中的函数表达式?,javascript,angular,lambda,functional-programming,angular-aot,Javascript,Angular,Lambda,Functional Programming,Angular Aot,如果尝试在装饰器中进行调用,Angular AoT编译器将抛出错误 考虑以下代码: export function factoryBuilder(config: MyConfig) { return function customFactory() { return new MyService(config); }; } @NgModule({}) export class MyModule { static forRoot(config: MyConfig): Modu

如果尝试在装饰器中进行调用,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模式下工作。

模块中不支持箭头函数(或lambda),因为AOT编译器需要能够“静态”分析模块

使用正常的
函数
而不是箭头函数可以解决以下问题:

export function myFactory(config) { };
您可能还需要对
myFactory
返回的
customFactory
函数执行相同的操作


您可以在或中找到有关AOT如何工作的更多信息。

可通过“导出常量myFactory…”修复?不,没关系。我改变了。问题不在于语法。即使使用函数语法重写,编译器也会抱怨。问题在于如何使用高阶函数()。我的问题是知道这在技术上是否不可能,以及为什么。我必须承认我不知道高阶函数的答案。我刚才在我的应用程序中,我最终复制了一些代码,而不是生成代码,我最大限度地避免了这些高阶函数。你能用你的第一句话更深入一点吗?我理解什么是静态的,但不是为什么它不首先传输,也不是为什么它在decorator中特别重要——否则lambda是完全允许的(事实上,根据您的构建目标,会传输到静态函数)