2016-10-19 3 views
0

/api/stuffs/Stuff의 목록을 얻을 수있는 나머지 URL이 있다고 가정 해 보겠습니다. extractStuffs 함수에서 stuffs 배열 Stuff하지만 어레이의 배열이 아니라고angular2 & typescript & reactiveX : http 결과를 가져 오는 방법

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>(); 
} 

모든 사실을 제외하고,이 코드와 잘 작동 : 여기

Stuff의 목록을 얻을 수는 HTTP에 코드입니다 함수의 서명이 Observable<Stuff[]>이고 API의 결과가 Stuff[]으로 캐스팅 된 경우에도 Object의 값을 반환합니다. 어떤 이상한 것은 그 타이프 라이터 컴파일러는 오류를 던지고되지 않는 것입니다 (결과 유형은 서명과 다른 경우에도) 우리는 생성 된 JS 파일을 살펴 가지고가는 경우에, 마녀는 완전히 정상입니다 :

StuffService.prototype.extractStuffs = function (res) { 
    var stuffs = res.json(); 
    return stuffs || new Array(); 
}; 

그래서 분명히 결과에 캐스팅을 Stuff[]은 컴파일러가 고려하지도 않습니다.

수동으로 수행하지 않고 올바르게 캐스팅 할 수있는 방법이 있습니까?

감사합니다.

답변

0

비슷한 상황에 처해질 때마다 루프를 통해 캐스팅합니다 (수동으로 정의하는 것으로 추측합니다).

는 고객 대신 거즈

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); 
    } 

주조 형 고객은 인터페이스와 예입니다. 여기

단일 개체 캐스팅이 아니라고 생략 Relationship.interface.ts

export interface Relationship { 
    id: string; 
    type: string; 
} 
+0

대한 코드 Customer.interface.ts 여기

import {Relationship} from './relationship.interface'; export interface Customer { customerId: string; name: string; lastName: string; code: string; relationships: Array<Relationship>; } 

의 코드이며 역시 ' stuffJson'은 여전히'물건 '대신'객체 '를 반환합니다. 여기에 생성 된 js =>'jsonStuffs.forEach (function (jsonStuff) {return stuffs.push (jsonStuff);}); '뭔가 내 컴파일러에서 누락 될 수 있습니까 ??? – dafriskymonkey

+0

물건을 주조하기위한 물건이 인터페이스가되어야합니다 (클래스가 아님). 이 사건이 당신에게 해당 되는가? – Picci

+0

실제로 그 클래스. 인터페이스로 재 시도하십시오. – dafriskymonkey