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"
}
}