阻止Angular中的直接模块导入

时间:2018-02-14 13:11:06

标签: angular typescript module angular5

我有一个声明我的组件的功能模块,还有一个配置功能路由的静态功能。

@NgModule({
  declarations: FEATURE_COMPONENTS,
  entryComponents: FEATURE_COMPONENTS,
  imports: [
    UIRouterModule,
    ...
  ]
})
export class FeatureModule {
  public static setParentState(stateName: string): ModuleWithProviders {
    ...
    return {
      ngModule: FeatureModule,
      providers: [
        ...UIRouterModule.forChild({ states: ... }).providers
        // my providers
        {
          provide: FEATURE_PROVIDER_TOKEN,
          useValue: ...
          multi: false
        }
      ]
    };
  }
}

我的模块本身不足以实际使用这些功能,它还需要通过上层静态功能正确完成的路由配置。

我想阻止这种情况:

@NgModule({
  ...
  imports: [
    // invalid import - I want to prevent this one
    FeatureModule
    // valid import
    FeatureModule.setParentState(...)
  ]
})
export class SomeAppModule {}

当用户尝试按照上面的代码直接导入我的功能模块时,如何抛出一些错误?正确导入是通过调用静态函数而不是直接导入...

我可以使用的一个可能的东西是额外的提供程序我正在添加我的静态函数。但是怎么样?通过模块构造函数及其注入?也许通过一些自定义装饰?

我想以某种方式这样做,但也想提供一些自定义错误消息,其中包含如何正确导入模块的信息:

@NgModule({ ... })
export class FeatureModule {
  public static setParentState(stateName: string): ModuleWithProviders {
    // FEATURE_PROVIDER_TOKEN defined here (see above)
    ...
  }

  constructor(
    @Import(FEATURE_PROVIDER_TOKEN) tokenTest: any
  } {
    // this will throw an error when provider isn't defined, but won't allow me to set specific error message
  }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

一种可行且有效的解决方案

这是我实施的,似乎满足要求:

  1. 不允许直接导入模块
  2. 它抛出并描述正确用法的错误
  3. 这就是它的实施方式:

    d <= 500000