2016-12-15 4 views
1

誰かがこれを理解するのを手伝ってもらえますか?私がAngular 2を学んだチュートリアルでは、Observableを介して日付を格納するインタフェースを使用しています。すなわち:.map((response:Response)=> response.json())。角2のインターフェイスプロパティマッピング

私が見つけた1つの問題は、インターフェイスのプロパティ定義がjsonプロパティと正確に一致する必要があることです。すなわち、 jsonのpropetyが_custNumの場合、私のインターフェースは同じ正確な名前_custNumを使用する必要があります。名前を「custNum」に変更するとマップされません。これはちょうどインタフェースを持つルールですか?

サンプルコード:私は「custNum」に上記のインターフェースにプロパティ「_custNum」を変更希望の場合

export interface ICustSearch { 
    _custNum: string; 
    _custName: string; 
    _address: string; 
    _city: string; 
    _state: string; 
    _zip: string; 
    _county: string; 
    _phone: string; 
} 

return this._http.get(APIRoutes.custSearchLocal, {headers: headers}) 
      .map((response: Response) => <ICustSearch[]> 
         response.json()) 
      .catch(this.handleError); 

は今のマップは、顧客番号に失敗していました。これのための回避策はありますか?また、なぜインタフェースとjsonオブジェクトのマッピングにクラスを使用するのですが、どのような利点がありますか?

ありがとうございます。

答えて

0

両方の質問は角度型ではなくタイプスクリプトと関連しています。

一般に、オブジェクトが提供された規約(Interface/Class)に従うことを検証するために、TypeScriptのキャストメカニズムです。あなたがクラスを使用することはできますが、クラス/インタフェースがメソッドを宣言している場合、提供されたオブジェクトはそれらのすべてを実装する必要があります(JSONでは間違いなく可能です)。そうでなければ、TypeScriptコンパイラはキャストできません。任意のオブジェクトをクラスに変換する技術(つまり、コンストラクタ、セッタ、コンバーターを使用して、オブジェクトでクラスインスタンスを拡張する)

そして、確かにあなたはクラス/インタフェースを避け、ちょうどanyタイプを使用することができます...

そして、はい、いいえこれかもしれない、あなたは実装していない限り/実装を見つけ、別の名前でプロパティをキャストする方法であっ構築されています別のコンバーター/工場になろう。

各インターフェース/クラスのプロパティにエイリアスのリストを割り当てるのはJPAドメインと似ている方が良いかもしれませんが、ほとんどの場合APIの変更はそれほど頻繁ではなく、JSONからTypeScriptインターフェイスのオンラインジェネレータを見つけることができます。

+0

A. Tim:応答に感謝します。これをAngularとしてマークして申し訳ありませんが、AngularとTypescriptは非常に新しいです。私はTypescriptとしてマークされた質問を続けます。 – David