如何在打字稿中检索类型T的泛型类的名称

时间:2020-03-20 12:55:22

标签: javascript angular typescript

我正在尝试在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 个答案:

答案 0 :(得分:1)

服务定位器的get方法必须接收一些内容,基于这些内容可以定位实例。

如果将签名更改为此:public static get<T>(fn: Function): T {

然后function类型有一个名为name的道具,您可以像这样在get内部使用它:

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

获取类实例的定位器可以通过以下方式调用:

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

选中此stackblitz