Búsqueda de sitios web

typescript - Angular 8: Las expresiones de función no son compatibles en los decoradores


Estoy teniendo problemas al intentar crear una compilación de producción en Angular 8. El error es

ERROR in Error during template compile of 'AppModule'
  Function expressions are not supported in decorators in 'SocketLibModule'
    'SocketLibModule' references 'initializeApp'
      'initializeApp' contains the error at ../socket-lib/src/lib/socket-lib.module.ts(9,12)
        Consider changing the function expression into an exported function.

¿Qué apunta a mi biblioteca?

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
      ]
    };
  }

}

El punto de error (9,12) se refiere a este return (uriConfig: any) => { justo en el paréntesis de apertura.

He intentado cambiar las funciones flecha por funciones normales, pero nada ha cambiado, así como el punto de error (9,12)

Respuesta #1

useFactory: initializeApp(socketConfig),

Esta línea es el problema.

El inicializador de la aplicación debería ser una fábrica: esto significa que debería ser

useFactory: initializeApp,

De lo contrario, estás devolviendo una llamada a una función, lo cual está prohibido en los decoradores de TypeScript (no solo en Angular, o su versión 8)

Respuesta #2

AOT solo admite llamadas a funciones limitadas.

Puedes usar el SOCKET_CONFIG ya proporcionado en lugar de envolver la fábrica en otra función:

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

El proveedor debería verse así:

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

Artículos relacionados