使用TypeScript泛型定义Factory方法的返回类型

时间:2019-02-06 02:46:09

标签: javascript typescript

基本上,我希望能够使用构造函数来调用通用TypeScript函数,并返回构造函数的乘积类型正确类型的变量。请参见下面的代码示例。最终console.log出现类型错误。

class TestType {
  constructor(
    public someVal: number
  ) {}
}

type GenericConstructor = new (...args: any) => any;

let map = new Map<GenericConstructor, any>();
map.set(TestType, new TestType(7));

console.log(map.get(TestType).someVal);

function retrieve<T extends GenericConstructor>(constructor: T): T {
  return map.get(constructor);
}

let retrieved = retrieve(TestType);
console.log(`retrieved: ${retrieved.someVal}`);

我搜索了其他答案,但似乎没有什么能掩盖这一切。我也觉得这可能是不可能的,因为我试图从类型而不是从实例中提取类型。

最简单的是,我希望此功能可以正常输入:

let val: SomeType = retrieve(SomeTypeConstructor);

没有第二种类型的参数,这可能吗?

1 个答案:

答案 0 :(得分:1)

InstanceType<T>是您所需要的:

function retrieve<T extends GenericConstructor>(constructor: T): InstanceType<T> {
  return map.get(constructor);
}