Как получить имя обобщенного c класса типа T в машинописи - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь реализовать шаблон Service Locator в TypeScript.

Вот мой код:

 //due to only partial knowledge of TypeScript
  private static serviceMap: Map<string, any>;

  public static get<T>(): T {
    // firstly lazily register all of the necessary services if this is the
    // first time calling get.
    if(this.serviceMap == undefined){
      this.init();
    }
    let service = this.serviceMap.get(T.name) //issue
    if(service == undefined){
      throw Error("You must register the service before retrieving it.")
    }
    return service;
  }

Проблема в строке, помеченной как проблема. Как вы видите, я пытаюсь получить имя типа класса, который я передаю в метод. Когда я пытаюсь вызвать T.name, я получаю эту ошибку:

TS2693: «T» относится только к типу, но здесь используется в качестве значения.

Как я могу получить имя класса типа T.

Я новичок в TypeScript, поэтому заранее прошу прощения, если ответ очень прост.

1 Ответ

1 голос
/ 20 марта 2020

Метод get Service Locator должен получить что-то, на основе чего можно найти экземпляр.

Если вы измените подпись на это: public static get<T>(fn: Function): T {

, то у типа function есть реквизит, называемый name, и вы можете использовать его внутри get следующим образом:

let service = Locator.serviceMap.get(fn.name);

Локатор, получающий экземпляры классов, может быть вызван с помощью:

const classInstance = Locator.get<ClassC>(ClassC);

Проверьте это stackblitz .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...