3

我有一个名为 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
        }
      ]
    };
  }

}

该库被导入到同一角度工作空间内的角度项目中。

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. 我没有尝试构建。

4

2 回答 2

2

最近几天我遇到了这个问题,并认为我已经找到了解决方案。对我来说,它发生在我从 Angular 10 升级我们的一些库的依赖项时。

我们的解决方案是确保 ModuleWithProviders 返回类型是模块的强类型,因此在您的情况下:

export class ThemexModule {
  static forRoot(config: {[key: string]: any}): ModuleWithProviders<ThemexModule> {
    [...]
}
于 2021-11-14T20:53:31.197 回答
0

正确的!提供签名是一个must特殊的 if/when 常春藤标志打开、完整或部分。

如果你没有forRoot()或者forChild()你不需要担心ModuleWithProviders。如果这样做,则返回类型。

这是为了当可发布库被推送到 npm 并且其他人将其拉入时。

export class SomeModuleModule {
  static forRoot(...): ModuleWithProviders<SomeModuleModule> {...}
}
{
  "angularCompilerOptions": {
    "enableIvy": true,
    "compilationMode": "partial"
  }
}
于 2021-11-29T20:29:09.230 回答