Как автоматически загружать файлы, которые содержат специфицированные c декораторы в проекте узла - PullRequest
1 голос
/ 15 марта 2020

Я создал декоратор в Project A (основная библиотека) и хотел бы, чтобы все эти декораторы автоматически загружались при запуске приложения в Project B (проект используя проект А). Есть ли способ сделать это?

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)

Есть ли что-то, что я могу сделать, чтобы автоматически выполнить @MyDecorator() на всех классы в Проект B без Проект B , требующий этого?

MyClass1.ts

import { MyDecorator } from 'project-a'

@MyDecorator()
export class ProjectBClass1 {}

MyClass2.ts

import { MyDecorator } from 'project-a'

@MyDecorator()
export class ProjectBClass2 {}

1 Ответ

0 голосов
/ 15 марта 2020
  • Я предполагаю, что вы имеете в виду создание экземпляров под нагрузкой.
  • Также я не уверен, что это элегантное решение, но вот мое предложение:

Создать класс, который имеет метод stati c:

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();
...