TypeScript返回对象构造为通用的

时间:2018-01-30 20:10:34

标签: typescript

我想定义以下泛型函数来处理从接口类型到实现此接口的类类型的转换。请考虑以下接口/类对:

interface IExample {
  num: number;
}

class Example implements IExample {
  num: number;
}

基本上,我想定义遵守以下合同的功能:

function fromInterfaceToObject<I, O extends I>(iIn: I): O

因此它接受基于传递接口的接口对象和返回类对象。问题是我需要在此函数中使用new

function fromInterfaceToObject<I, O extends I>(iIn: I): O{
  return new O(iIn);
}

哪个生成打字稿错误: O only refers to type, but is being used as a value here。我自己做了一些研究,最后得到了TS食谱说明on referring class types,但说实话,我无法将示例应用于我的用例...所有以下定义都失败了:

function fromInterfaceToObject<I, O extends I>(iIn: I): {new(I): O} 
function fromInterfaceToObject<I, O: {new(): O}>(iIn: I): O

我对此问题的任何支持感激不尽

1 个答案:

答案 0 :(得分:1)

问题是O在运行时不存在(泛型在运行时在typescript中被擦除),并且在运行时,您需要使用O来实例化新类。您需要将实际构造函数传递给函数:

function fromInterfaceToObject<I, O extends I>(iIn: I, o: new (iIn: I) => O): O {
    return new o(iIn);
}

fromInterfaceToObject({ num: 10 }, Example);