在TypeScript中类到实例注册表的键入

时间:2018-10-12 08:00:12

标签: typescript

我正在尝试使用类作为注册表方法的输入值,其中返回值是该实例的缓存实例。但是,我找不到使这种类型安全的方法。

我想要的是这样的

class MyRegistry {
  getInstance<T, C extends Class<T>>(cls: C): T;
}

let x: MyThing = registry.getInstance(MyThing);

有没有办法使这项工作有效?我知道有很多方法可以输入可更新内容,但是我找不到找到具体的返回值的方法。

2 个答案:

答案 0 :(得分:1)

您的参数类型应描述您作为参数传递的Class的构造函数。这可以通过通用接口来实现:

interface Class<T> {
  new (...args: any[]): T;
}

class MyRegistry {
  getInstance<T>(param: Class<T>): T {
    // do your magic
  }
}

您可以在工作here中看到它。

如果您需要使用子类C,那么当然可以通过以下方式轻松扩展:

class MyRegistry {
  getInstance<T, C extends T>(param: Class<C>): T {
    // do your magic
  }
}

答案 1 :(得分:0)

您需要使用构造函数签名来使编译器从构造函数中提取实例类型:

class MyRegistry {
    getInstance<T>(cls: new (...args: any[])=> T): T {
        return null as any;
    }
}

class MyThing { private x: number }

let registry = new MyRegistry();
let x = registry.getInstance(MyThing); // inffered as MyThing