2017-03-10 22 views
0

I次のJSONがあります角度2キャストJSON

{ 
    "AssetId": "Asset1", 
    "Currency": "USD", 
    "Rating": "BBB", 
    "Dur": 0.557519237 
} 

とクラス:

export class Constituent { 

AssetId?: string; 
Currency?: string; 
Rating?: string; 
Dur?: number; 

public get maturityBucket(): string { 
    const dur = this.Dur || 0; 

    if (dur < 0.5) { 
     return '0-6m'; 
    } 
    if (dur < 1) { 
     return '6m-1y'; 
    } 
    if (dur < 2) { 
     return '1y-2y'; 
    } 
    if (dur < 5) { 
     return '2y-5y'; 
    } else { 
     return '5y+'; 
    } 
} 

}しかし

、私はJSONを読みますのように:

loadConstituentData(): void { 
    const url = './src/data/assets.json'; 

    this.http.get(url) 
     .subscribe(response => { 
      this.data.next(<Constituent[]>response.json()); 
     }, this.handleError); 
} 

Th e maturityBucket読み取り専用プロパティが表示されなくなります。

どうすればこの問題を解決できますか?ここで

は、コードのPlunkerです: https://plnkr.co/edit/3oRl9zIlG23jBUvUqaw6?p=previewあなたはちょうどこのオブジェクトは、さらに型チェックのための特定のタイプを持っていることを活字体コンパイラを伝えるあなたは、このオブジェクトを変更しない、特定のクラスまたはインタフェースにオブジェクトをキャストしようと

答えて

0

。この場合、オブジェクトにはすべてのプロパティがありますが、メソッド(実際にはメソッドであるgetterプロパティ)はありません。このため、コンパイラと自分自身を誤解させてしまいます。この読み込み専用プロパティを機能させるには、それをオブジェクトに追加する必要があります。

Yoは、Constituentの新しいインスタンスを作成し、オブジェクトからプロパティを割り当てることで、望ましい動作を達成できます。たとえば:

export class Constituent { 

    AssetId?: string; 
    Currency?: string; 
    Rating?: string; 
    Dur?: number; 

    static createFromJsonObject(jsonObject: any): Constituent { 
    let constituent = new Constituent(); 
    return Object.assign(constituent, jsonObject); 
    } 
    ... 
} 

と使用方法は次のとおりです。

this.http.get(url) 
     .subscribe(response => { 
      this.data.next(response.json().map(item => Constituent.createFromJsonObject(item))); 
     }, this.handleError); 
+0

素晴らしいです!どうもありがとう、このウェブ全体のものは少し使い慣れています(私は主にC#開発者です)。 – markblandford

+0

非常に良い応答。 this.http.get(url) .map(response.json()) .map(item => Constituent.createFromJsonObject(item))のような操作を分解することで、 ) .subscribe(構成要素=> { this.data.next(構成要素); }、this.handleError); これは、パックに参加する新しい開発者のベストプラクティスと高い可読性を促進するのに役立ちます。 –