Angular Workspace/Monorepo, forRoot выдает ошибки. «Значение для 'forRoot' не может быть определено статически, так как это внешнее объявление».

У меня есть библиотека под названием Themex.

      //envInjector.ts
    import {InjectionToken} from "@angular/core";
    export const ENVIRONMENT = new InjectionToken<{[key: string]: any}>('ENVIRONMENT');

//themex.module.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
        }
      ]
    };
  }

}

Библиотека импортируется в проект angular внутри той же рабочей области angular.

      import {ThemexModule} from "themex";

Если я импортирую его, как указано выше, я получаю сообщение об ошибке.

«Значение для 'forRoot' не может быть определено статически, так как это внешнее объявление».

Однако, если я импортирую его, как указано ниже, все вроде работает.

      import {ThemexModule} from "../../../themex/src/lib/themex.module";

я использую

      Angular CLI: 12.0.5
Node: 14.16.1

Мои параметры компилятора. tsConfig.json

Все ошибки возникают, когда я делаю ng serve. Сборку не пробовал.

2 ответа

У меня была эта проблема в последние несколько дней, и я думаю, что нашел решение. У меня это произошло, когда я обновлял зависимости некоторых наших библиотек от Angular 10.

Наше решение заключалось в том, чтобы убедиться, что возвращаемый тип ModuleWithProviders строго типизирован для модуля, поэтому в вашем случае:

      export class ThemexModule {
  static forRoot(config: {[key: string]: any}): ModuleWithProviders<ThemexModule> {
    [...]
}

Правильный! Предоставление подписи является mustособенно если / когда флаг Ivy включен, полный или частичный.

Если у вас нет forRoot()или же forChild()вам не нужно беспокоиться о ModuleWithProviders. Если вы это сделаете, верните тип.

Это на тот случай, когда публикуемая библиотека передается в npm, а другие загружают ее.

      export class SomeModuleModule {
  static forRoot(...): ModuleWithProviders<SomeModuleModule> {...}
}
      {
  "angularCompilerOptions": {
    "enableIvy": true,
    "compilationMode": "partial"
  }
}
Другие вопросы по тегам