【问题标题】:How to automatically load files that contain specific decorators in a node project如何在节点项目中自动加载包含特定装饰器的文件
【发布时间】:2020-06-26 21:13:11
【问题描述】:

我在 Project A(主库)中创建了一个装饰器,并希望在 Project B 中启动应用程序时自动加载所有这些装饰器(项目使用项目 A)。有没有办法做到这一点?

index.ts 看起来像这样:

export function MyDecorator<T extends Controller>() {
  return (target: new () => T) => {
    // Do stuff with the decorator
  }
}

const server = http.createServer((req, res) => {

})
server.listen(8080)

我可以做些什么来在 Project B 中的所有类上自动执行 @MyDecorator() 而无需 Project B 这样做?

MyClass1.ts

import { MyDecorator } from 'project-a'

@MyDecorator()
export class ProjectBClass1 {}

MyClass2.ts

import { MyDecorator } from 'project-a'

@MyDecorator()
export class ProjectBClass2 {}

【问题讨论】:

  • 我不确定你能做到这一点,节点有global,但我不确定它是否有帮助。您在其中一个开源库中有任何示例吗?我只知道 NestJS,它导出了装饰器。
  • 我从未使用过 NestJS,但查看文档可能是我想要的,但我不确定。在文档中,他们似乎从来没有引用过他们的控制器,他们只是创建了它们,它们就在那里,这就是我想要的。
  • 不,你仍然需要在 NestJS 中导入它的装饰器,我的意思是,如果你有任何我想深入研究的开源示例。我只在 NestJS 和 Angular 中使用 TS,它们总是导出它。我没有看到任何全球实施。
  • @mandaputtra 导入装饰器很好,我只是不想导入MyClass1.tsMyClass2.ts,我希望它们是自动导入的。
  • @GetOffMyLawn -- 你找到一个好的解决方案了吗?

标签: javascript node.js typescript decorator typescript-decorator


【解决方案1】:
  • 我假设您的意思是通过负载创建实例。
  • 我也不确定这是否是一个优雅的解决方案,但这是我的建议:

创建一个具有静态方法的类:

class ControllerCreator {
  private static constrollerInstances: any = []
  private static controllerConstructors : any = [];  

  static registerControllerClass(ctor: any) {
    ControllerCreator.controllerConstructors.push(ctor);
  }

  static createInstances() {
    ControllerCreator.controllerConstructors.forEach(
      ctor => constrollerInstances.push(new ctor()) // pushing them to static array to not lose
    )
  }
}

在你的装饰器中你应该注册你的控制器构造函数:

export function MyDecorator<T extends Controller>() {
  return (target: new () => T) => {
    // Do stuff with the decorator
    class newClass extends target {
      // ...
    }

    ControllerCreator.registerControllerClass(newClass);
  }
}

最后在某个时候你应该调用:

ControllerCreator.createInstances();

【讨论】:

  • 不,我不想创建实例。我想执行我的装饰器,而不必在我的代码中执行import {...} from '...'。我只是希望他们自动导入或自动引导文件。
  • 您只是想摆脱导入语句吗?如果是这样对您有帮助:stackoverflow.com/questions/47736473/…
  • 项目 B 中是的。在 Project A 中,我不想加载文件,但如果需要,我可以将它们全局化并在那里进行导入,但我真的不想这样做。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2013-10-25
相关资源
最近更新 更多