库中的APP_INITIALIZER导致“不支持Lambda”错误

时间:2018-08-22 23:58:49

标签: angular angular-cli ng-packagr

在库模块中定义APP_INITIALIZER时,构建失败,并显示Lambda not supported错误。导出函数as per docs时会引发构建错误:

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { MylibComponent } from './mylib.component';

export function myLibInit() {
  return () => console.log('Hi from exported function');
}

@NgModule({
  providers: [
    {
      provide: APP_INITIALIZER,
      multi: true,
      useFactory: myLibInit
    }
  ]
})
export class MylibModule { }

devprod中都引发了构建错误。

我也尝试使用ES6对象方法的简写形式定义工厂功能:

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { MylibComponent } from './mylib.component';

@NgModule({
  providers: [
    {
      provide: APP_INITIALIZER,
      multi: true,
      useFactory() {
        return () => console.log('Hi from ES6 object method shorthand')
      }
    }
  ]
})
export class MylibModule { }

这会同时通过devprod构建,但是当使用ERROR TypeError: this.appInits[r] is not a function标志构建库和应用时,应用会在运行时抛出prod错误。 / p>

如何正确使用库中的APP_INITIALIZER而不出现构建或运行时错误?

可以找到复制品here

  1. git clone https://github.com/samherrmann/angular-sandbox.git
  2. cd angular-sandbox
  3. git checkout lambda-not-supported
  4. npm install
  5. npm run build

有关此问题的GitHub问题可以找到here

2 个答案:

答案 0 :(得分:5)

我了解的是,在编译时,打字稿编译器会尽力解决。

所以当您这样做时:

export function myLibInit() {
  return () => console.log('Hi from exported function');
}

它试图将其解析为简单的() => console.log('Hi from exported function');,因为该函数没有执行其他任何操作。

现在,让我们使函数做更多一点:

export function myLibInit() {
  var x = 2+2; //let us just do something to keep this original function
  return () => console.log('Hi from exported function');
}

该代码编译没有错误,因为它没有返回唯一且精确的lamda函数。

下面的一个也可以工作,因为还有一个额外的任务。

export function myLibInit() {
  var x = () => console.log('Hi from exported function');
  return x;
}

您当然可以兑现承诺。

我确实看到了您指向某些教程的链接,并且它们确实在解决您遇到的问题,并且我认为它们可能已过时或在您使用的angular版本中没有完成。因为文档明确指出

  

“编译器当前不支持函数表达式或   lambda函数。 “

他们的做法与此类似。原因之一可能是他们实际上从未执行过构建,因为它不会给您ng serve

上的错误

我可以看到他们已经在github上关闭了您的问题,但是由于我上面的解释,我认为他们应该对其进行审查。

答案 1 :(得分:0)

尝试在函数 myLibInit() 上方使用此代码示例。有关详细信息,请参阅 this

/**
 * @dynamic
 */