Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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,我正在使用一个公共RESTful API,它返回的对象包含指向更多信息的URL字段。我想将这些字段包装在一个对象中,以指示它们指向的对象,因此我创建了一个如下的对象: class APIResource<T> { url: string; } 基本上,我通过ajax请求从API获取json,然后将其传递给我类型的构造函数并返回对象。它的用法如下: var person: Person; api.get('/person/1/', Person).subscribe(p =&

我正在使用一个公共RESTful API,它返回的对象包含指向更多信息的URL字段。我想将这些字段包装在一个对象中,以指示它们指向的对象,因此我创建了一个如下的对象:

class APIResource<T> {
    url: string;
}
基本上,我通过ajax请求从API获取json,然后将其传递给我类型的构造函数并返回对象。它的用法如下:

var person: Person;
api.get('/person/1/', Person).subscribe(p => person = p);
var res: APIResource<Person> = { url: '/person/1/' };
var person: Person;
api.getResource(res).subscribe(p => person = p);
如果我要传入构造函数,这是可行的,但我想做的是编写一个
getResource(resource:apirource):Observable
函数,这样我就可以执行以下操作:

var person: Person;
api.get('/person/1/', Person).subscribe(p => person = p);
var res: APIResource<Person> = { url: '/person/1/' };
var person: Person;
api.getResource(res).subscribe(p => person = p);

类资源{
url:string;
fetch():T{
//只是测试一下tsc是否投诉
//它与“找不到名称T”一起使用
var obj:any={};
返回新的T(obj);
}
}
但两者都不起作用。我知道类型信息一旦成为javascript就消失了。我想我可以用构造函数来代替类型的移动,但是我不认为我可以用泛型来完成

是否有任何方法可以让泛型发挥作用


我正在使用typescript 1.8.7

这里有一种在typescript中使用泛型来保持强类型的方法:

接口可构造{
系数:新(…参数)=>T;
url:string;
}
类APIResource实现可构造的{
建造师(
公共ctor:new(…args)=>T,
公共url:string
) {}
}
班主任{
名称:字符串;
年龄:人数;
构造函数(对象:任何){
//赋值(this,obj);//需要ES6
对于(obj中的var键),此[键]=obj[键];
}
打印(){
log(`this.name}是${this.age}`);
}
}
函数getResource(apirource:apirource):T{
log(`resource url:${apirource.url}`);
//假设这是从ajax请求返回的
让obj:any={姓名:'Arthur',年龄:42};
console.log(`obj instanceof Person?${obj instanceof Person}`);//false
返回新的apiResource.ctor(obj);
}
const res=新资源(Person,“/Person/1/”);
let person=getResource(res);
console.log(`person instanceof person?${person instanceof person}`);//真的
person.print();

我简化了代码,这样它就可以在一个独立的TypeScript文件中运行,以显示这个想法,而不需要Angular 2和rxjs依赖项。但是,在Angular 2中将其扩展到http调用是直截了当的(为了清晰起见分为多个映射):

getResource(apirource:apirource):可观察{
返回此.http.get(apiResource.url)
.map(result=>result.json())
.map(obj=>newapiresource.ctor(obj));
}

然后你可以像往常一样通过订阅来使用强类型的结果。

泛型的TypeScript常见问题解答部分有三个问题,你在这里问每个问题:)你有没有得到一个好的答案?@Shane我2016年的答案是这个lol的好答案。你试过吗?@rob3c我最终得到了类似的答案。我觉得必须传入对象而不是进行推断本身并不完全是“好”的,但不是你的错。@Shane不确定“必须传入对象而不是进行推断”是什么意思。这样传递的是类型,而不是实例。是的,TS在这里并不理想,但是您不需要用泛型以某种方式参数化类型吗?TS不允许您在函数中使用泛型参数,如某些语言-信息在运行时消失。这种方式从作为泛型参数传递它转变为直接传递它。它仍然只通过了一次,所以效率不亚于问题。事实上,当直接传递
Person
时,不需要括号,因此有人可能会认为它的2个字符更有效:-)
class APIResource<T extends Constructable<T>> {
  url: string;

  fetch(): T {
    // just a test to see if tsc complains
    // which it does with "cannot find name T"
    var obj: any = {};
    return new T(obj);
  }
}
getResource<T>(apiResource: APIResource<T>): Observable<T> {
    return this.http.get(apiResource.url)
        .map(result => result.json())
        .map(obj => new apiResource.ctor(obj));
}