Tengo una biblioteca llamada Themex.
//envInjector.ts import {InjectionToken} from "@angular/core"; export const ENVIRONMENT = new InjectionToken<{[key: string]: any}>('ENVIRONMENT');
//themex.módulo.ts
import {ENVIRONMENT} from "./envInjector"; @NgModule({ declarations: [ ThemexComponent, ModalComponent, UploadComponent, AlertComponent, ], imports: [ CommonModule ], exports: [ ThemexComponent, ModalComponent, UploadComponent, AlertComponent, ], providers: [] }) export class ThemexModule { static forRoot(config: {[key: string]: any}): ModuleWithProviders<any> { return { ngModule: ThemexModule, providers: [ { provide: ENVIRONMENT, useValue: config } ] }; } }
La biblioteca se importa a un proyecto angular dentro del mismo espacio de trabajo angular.
import {ThemexModule} from "themex";
Si lo estoy importando como se indicó anteriormente, aparece un error.
"Un valor para 'forRoot' no se puede determinar de forma estática, ya que es una declaración externa".
Sin embargo, si lo estoy importando como se indica a continuación, todo parece funcionar.
import {ThemexModule} from "../../../themex/src/lib/themex.module";
Estoy usando
Angular CLI: 12.0.5 Node: 14.16.1
Mis opciones del compilador. tsConfig.json
Todos los errores son cuando estoy haciendo un ng serve
. No he probado a construir.
He tenido este problema los últimos días, y creo que he encontrado la solución. Para mí, ocurrió cuando estaba actualizando las dependencias de algunas de nuestras bibliotecas desde Angular 10.
Nuestra solución fue asegurarnos de que el tipo de retorno ModuleWithProviders estuviera fuertemente tipado para el módulo, así que en su caso:
export class ThemexModule { static forRoot(config: {[key: string]: any}): ModuleWithProviders<ThemexModule> { [...] }
¡Correcto! Proporcionar la firma es must
especialmente si / cuando la bandera Ivy está encendida, total o parcialmente.
Si no tiene forRoot()
o forChild()
, no necesita preocuparse por ModuleWithProviders
. Si lo hace, devuelva el tipo.
Esto es para cuando la biblioteca publicable se envía a npm y otros la incorporan.
export class SomeModuleModule { static forRoot(...): ModuleWithProviders<SomeModuleModule> {...} }
{ "angularCompilerOptions": { "enableIvy": true, "compilationMode": "partial" } }