2016-10-19 11 views
0

このURLに残りのAPIがあるとします。/api/stuffs/ここでStuffのリストを取得できます。すべてがextractStuffs機能でstuffs配列はStuffの配列が、そして配列でないという事実を除いて、このコードで正常に動作しますangular2&typescript&reactX: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>(); 
} 

:ここ

は、httpにコードがStuffのリストを取得することです関数の署名がObservable<Stuff[]>でapiの結果がStuff[]にキャストされていても、Objectの代わりに結果をキャストするので、明らかに

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

:どのような奇妙なことはtypescriptですコンパイラは(結果の型はシグネチャと異なっていても)すべてのエラーを投げていない、我々は生成されたJSファイルを見てみるならば、魔女は完全に正常であることです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); 
    } 

のお客様との一例です。ここで

のコード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; 
} 
+0

するためのコードでありますいずれも動作していますが、 ' stuffJson'は' Stuff'の代わりに 'Object'を返します。ここで生成されたjs => 'jsonStuffs.forEach(function(jsonStuff){return stuffs.push(jsonStuff);});'私のコンパイラで何かが欠落する可能性がありますか? – dafriskymonkey

+0

キャスト用のインターフェース(クラスではない)が必要です。これはあなたの場合ですか?実際には – Picci

+0

です。インターフェースで再試行してください。 – dafriskymonkey

関連する問題