我遇到了这个问题,搜索了几个小时,无法找到合适的解决方案。 我试图创建一个恢复类型和对象的泛型函数,并将对象转换为该特定类型。但我在实例化泛型类型方面遇到了麻烦。我想知道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;
}
答案 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 } });