Angular 8:装饰器不支持函数表达式

时间:2019-06-19 08:16:42

标签: angular typescript

尝试在Angular 8中构建产品时遇到麻烦。错误是

  

在“ AppModule”模板编译期间发生错误ERROR     'SocketLibModule'中的装饰器不支持函数表达式       'SocketLibModule'引用'initializeApp'         'initializeApp'包含位于../socket-lib/src/lib/socket-lib.module.ts(9,12)的错误           考虑将函数表达式更改为导出的函数。

什么指向我的库

export const SOCKET_CONFIG = new InjectionToken<SocketConfig>('SOCKET_CONFIG');

export function initializeApp(socketConfig: SocketConfig) {
    return (uriConfig: any) => {
        return () => uriConfig.load(socketConfig);
    };
}

@NgModule()
export class SocketLibModule {

    public static forRoot(socketConfig: SocketConfig): ModuleWithProviders {
        return {
            ngModule: SocketLibModule,
            providers: [
                {
                    provide: SOCKET_CONFIG,
                    useValue: socketConfig
                },
                {
                    provide: APP_INITIALIZER,
                    useFactory: initializeApp(socketConfig),
                    deps: [ConfigInitService, HttpClientModule],
                    multi: true
                },
                HttpClientModule
            ]
        };
    }

}

错误点(9,12)仅在打开括号时引用此return (uriConfig: any) => {

我尝试将箭头功能更改为常规功能,但错误点(9,12)并没有改变

2 个答案:

答案 0 :(得分:2)

useFactory: initializeApp(socketConfig),

这是问题所在。

应用程序初始化程序应该是工厂:这意味着它应该是

useFactory: initializeApp,

否则,您将返回一个函数调用,在打字稿装饰器中(这不仅限于Angular或第8版),禁止使用此函数

答案 1 :(得分:2)

AOT仅支持有限功能调用。

您可以使用已经提供的SOCKET_CONFIG而不是将工厂包装在另一个函数中

export function initializeApp(uriConfig: ConfigInitService, socketConfig: SocketConfig) {
   return uriConfig.load(socketConfig);
}

提供程序应如下所示:

{
    provide: APP_INITIALIZER,
    useFactory: initializeApp,
    deps: [ConfigInitService, SOCKET_CONFIG],
    multi: true
},