在库模块中定义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 { }
dev
和prod
中都引发了构建错误。
我也尝试使用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 { }
这会同时通过dev
和prod
构建,但是当使用ERROR TypeError: this.appInits[r] is not a function
标志构建库和应用时,应用会在运行时抛出prod
错误。 / p>
如何正确使用库中的APP_INITIALIZER
而不出现构建或运行时错误?
可以找到复制品here:
git clone https://github.com/samherrmann/angular-sandbox.git
cd angular-sandbox
git checkout lambda-not-supported
npm install
npm run build
有关此问题的GitHub问题可以找到here。
答案 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
*/