角度2&打字稿& reactiveX:如何转换http获取结果

时间:2016-10-19 16:56:01

标签: angular typescript casting frontend reactivex

假设我们在此网址/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[]

有没有办法在不手动操作的情况下正确投射?

感谢。

1 个答案:

答案 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;
}