Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 类型脚本实例化泛型对象_Generics_Typescript - Fatal编程技术网

Generics 类型脚本实例化泛型对象

Generics 类型脚本实例化泛型对象,generics,typescript,Generics,Typescript,我有这个问题,搜索了几个小时却找不到正确的解决方案。 我试图创建一个泛型函数,用于恢复一个类型和一个对象,并将该对象转换为该特定类型。但是我很难实例化泛型类型。我想知道在c#Activator.CreateInstance中是否有类似的内容 handleResult<T>(response: Response):T { let jsonResp = response.json(); let obj = jsonResp as Object; let resp:

我有这个问题,搜索了几个小时却找不到正确的解决方案。 我试图创建一个泛型函数,用于恢复一个类型和一个对象,并将该对象转换为该特定类型。但是我很难实例化泛型类型。我想知道在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;
}
handleResult(响应:响应):T{
让jsonResp=response.json();
让obj=jsonResp作为对象;
让resp:T=Object.CreateInstance(T);//
doTheMambo(分别为obj);
返回响应;
}

在typescript中,泛型参数在编译过程中被删除,并且在生成的javascript代码中没有它们的痕迹。因此,没有什么比c#中的
CreateInstance
更好的了

但是,与c#不同的是,typescript中的类在运行时可以像任何其他对象一样使用,因此,如果您只需要在运行时创建类的实例,那么您可以非常轻松地做到这一点(请注意,它仅适用于类,而不适用于一般的任何类型)

的语法看起来有点不寻常:它是写为
{new(…args:any[]):T}

下面是一个完整的(它编译)示例,它与您在问题中描述的类似。为了简化,我假设所有需要实例化的对象都必须符合公共
接口结果
(否则,您必须对dothembo中的某个已知类型执行类型转换才能执行有用的操作)

接口响应{json():any}
接口结果{kind:string}
函数handleResult(tClass:{new(…args:any[]):T},response:response):T{
让jsonResp=response.json();
设obj=jsonResp;
让resp:T=新的tClass();
doTheMambo(分别为obj);
返回响应;
}
课堂结果1{
种类='result1';
}
函数doTheMambo(响应:T,对象:any){
console.log(response.kind);
}
const r:Result=handleResult(Result1,{json(){returnnull}});

在typescript中,泛型参数在编译过程中被删除,并且在生成的javascript代码中没有它们的痕迹。因此,没有什么比c#中的
CreateInstance
更好的了

但是,与c#不同的是,typescript中的类在运行时可以像任何其他对象一样使用,因此,如果您只需要在运行时创建类的实例,那么您可以非常轻松地做到这一点(请注意,它仅适用于类,而不适用于一般的任何类型)

的语法看起来有点不寻常:它是写为
{new(…args:any[]):T}

下面是一个完整的(它编译)示例,它与您在问题中描述的类似。为了简化,我假设所有需要实例化的对象都必须符合公共
接口结果
(否则,您必须对dothembo中的某个已知类型执行类型转换才能执行有用的操作)

接口响应{json():any}
接口结果{kind:string}
函数handleResult(tClass:{new(…args:any[]):T},response:response):T{
让jsonResp=response.json();
设obj=jsonResp;
让resp:T=新的tClass();
doTheMambo(分别为obj);
返回响应;
}
课堂结果1{
种类='result1';
}
函数doTheMambo(响应:T,对象:any){
console.log(response.kind);
}
const r:Result=handleResult(Result1,{json(){returnnull}});

response.json()返回什么?对象,还是该对象的字符串表示?如果它直接返回一个对象,那么该对象与
T
之间有什么区别,您希望在
doTheMambo
中解决这些区别?response.json返回一个json,DotheMBO将在这两个对象之间进行某种解析。这两个对象之间可能存在重大差异。在运行时无法使用
T
,因此无法传递它。您能更好地描述一下您正在使用的json是什么以及您想要创建的对象是什么吗?
response.json()
返回什么?对象,还是该对象的字符串表示?如果它直接返回一个对象,那么该对象与
T
之间有什么区别,您希望在
doTheMambo
中解决这些区别?response.json返回一个json,DotheMBO将在这两个对象之间进行某种解析。这两个对象之间可能存在重大差异。在运行时无法使用
T
,因此无法传递它。您能更好地描述一下您正在使用的json是什么以及您想要创建的对象是什么吗?
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 } });