Typescript实例化通用对象

时间:2016-12-21 11:13:20

标签: generics typescript

我遇到了这个问题,搜索了几个小时,无法找到合适的解决方案。 我试图创建一个恢复类型和对象的泛型函数,并将对象转换为该特定类型。但我在实例化泛型类型方面遇到了麻烦。我想知道c#Activator.CreateInstance

中是否有类似的东西
handleResult<T>(response: Response):T {
    let jsonResp = response.json();
    let obj = jsonResp as Object;
    let resp: T = Object.CreateInstance(T); //        
    doTheMambo(resp, obj);
    return resp;
}

1 个答案:

答案 0 :(得分:2)

在打字稿中,通用参数在编译期间被删除,并且在生成的javascript代码中没有它们的痕迹。所以与c#中的CreateInstance没有任何关系。

但是,与c#不同,typescript中的类可以在运行时使用,就像任何其他对象一样,所以如果你只需要在运行时创建一个类的实例,你就可以很容易地做到这一点(注意它只适用于对于课程,而不是一般的任何类型。)

generic class type argument的语法看起来有点不寻常:它是一个写成{new(...args: any[]): T}

的文字类型

这是完整的(它编译)示例,它可以执行您在问题中描述的内容。为了简化,我认为需要实例化的所有对象必须符合公共interface Result(否则你必须在doTheMambo中对某些已知类型进行类型转换以做一些有用的事情)。

interface Response { json(): any }

interface Result { kind: string }

function handleResult<T extends Result>(tClass: { new (...args: any[]): T }, response: Response): T {
    let jsonResp = response.json();
    let obj = jsonResp;
    let resp: T = new tClass();        
    doTheMambo(resp, obj);
    return resp;
}

class Result1 {
    kind = 'result1';
}

function doTheMambo<T extends Result>(response: T, obj: any) {
    console.log(response.kind);
}

const r: Result = handleResult(Result1, { json() { return null } });