簡體   English   中英

Angular Workspace/Monorepo,forRoot 給我錯誤。 “'forRoot' 的值不能靜態確定,因為它是一個外部聲明。”

[英]Angular Workspace/Monorepo, forRoot giving me errors. "A value for 'forRoot' cannot be determined statically, as it is an external declaration."

我有一個名為 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

我的編譯器選項。 配置文件在此處輸入圖片說明

所有的錯誤都是在我做ng serve 我沒試過構建。

最近幾天我遇到了這個問題,我想我已經找到了解決方案。 對我來說,它發生在我從 Angular 10 升級對我們某些庫的依賴項時。

我們的解決方案是確保模塊的 ModuleWithProviders 返回類型是強類型的,因此在您的情況下:

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

正確的! 提供簽名是must特別是如果/當常春藤標志開啟、完整或部分時。

如果您沒有forRoot()forChild() ,則無需擔心ModuleWithProviders 如果這樣做,則返回類型。

這是當可發布庫被推送到 npm 而其他人將其拉入時。

export class SomeModuleModule {
  static forRoot(...): ModuleWithProviders<SomeModuleModule> {...}
}
{
  "angularCompilerOptions": {
    "enableIvy": true,
    "compilationMode": "partial"
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM