假设我们在此网址/api/stuffs/
处有一个休息API,我们可以在其中获取Stuff
的列表。
这是http获取Stuff
列表的代码:
getStuffs(): Observable<Stuff[]> {
return this.http.get(this.url)
.map(this.extractStuffs)
.catch(this.handleError);
}
private extractStuffs(res: Response) {
let stuffs = res.json() as Stuff[];
return stuffs || new Array<Stuff>();
}
此代码的一切正常,但stuffs
函数中的extractStuffs
数组不是Stuff
的数组,而是Object
的数组,即使函数的签名是Observable<Stuff[]>
,api的结果也会转换为Stuff[]
。什么奇怪的是,打字稿编译器没有抛出任何错误(即使结果类型与签名不同),如果我们看一下生成的JS文件,那就完全正常了:
StuffService.prototype.extractStuffs = function (res) {
var stuffs = res.json();
return stuffs || new Array();
};
因此,编译器甚至不会考虑将结果转换为Stuff[]
。
有没有办法在不手动操作的情况下正确投射?
感谢。
答案 0 :(得分:0)
每次我处于类似情况时,我都会通过循环进行投射(我猜你是手动定义的)。
这是与客户而不是Stuffs
的示例getCustomers(code: string) {
let url = environment.baseServicesUrl + 'customer';
let jsonParam = {code: code};
return this.http.post(url, jsonParam, this.getOptions())
.map(this.extractData)
.map((customerJsons) => {
let customers = new Array<Customer>();
customerJsons.forEach((customerJson) => {
customers.push(<Customer>customerJson);
})
return customers
})
.catch(this.handleError);
}
投射类型Customer是一个界面。
以下是 Customer.interface.ts
的代码import {Relationship} from './relationship.interface';
export interface Customer {
customerId: string;
name: string;
lastName: string;
code: string;
relationships: Array<Relationship>;
}
以下是 Relationship.interface.ts
的代码export interface Relationship {
id: string;
type: string;
}