4

Web サービスから返された json オブジェクト配列を、Angular 2 アプリケーションで正しく型指定されたオブジェクト配列にマップする方法がわかりません。

plunker での Angular 2 の公式の例でわかるように、予想されるオブジェクトは Hero タイプではなく、Object タイプであり、HeroListComponent の hero:Hero[] メンバーは実際には Object[] です。コンソールで、配列が厳密に型指定されていないことがわかります。

http://plnkr.co/edit/Qa22yzPh3JWI8lNZ99Ik?p=preview

追加の console.log() 呼び出しを追加して、hero コマンドを追加しました。ブラウザー コンソールで、Hero[] ではなく Object[] があることがわかります。

したがって、明らかにここでは変換が機能しません。

    this.http.get(this._heroesUrl)
            .map(res => <Hero[]> res.json().data)
            .catch(this.handleError);

Hero[] の代わりに Object[] を取得します。

json を正しく型指定されたオブジェクトにマップする方法についてのアイデアはありますか?

詳細: https://angular.io/docs/ts/latest/guide/server-communication.html

4

2 に答える 2

3

お使いのブラウザは TypeScript ではなく、おそらく ES5 の JavaScript を実行しています。TypeScript では配列に型定義を指定できますが、JavaScript では配列はオブジェクトの配列です。そこには何でも入れることができ、タイプされません。

ES6 には型付き配列がありますが、実際には配列ではなく、バイナリ データを処理するためのオブジェクトです。

TypeScript 表記法 ( type assertion ) は、オブジェクト配列がオブジェクトまたは互換性のあるオブジェクトのみを含んでいるかのように使用されていることをコンパイラがチェックするためだけのHeroものです。実行時に強制されず、コードを発行しません。

于 2016-04-01T21:06:39.520 に答える
3

Angular 2 オブザーバブルはモデルに「マップ」しません

上記のリンクの重複した問題に見られるように、json オブジェクトから独自の typescript クラスへの自動マッピングは、依然として手動プロセスです....

Typescript は、 map() 呼び出しの最後に Hero オブジェクトを取得するような方法でトランスパイルするのに十分賢いと本当に思っていました。

このような呼び出しの最後に Hero[] を取得する簡単な方法があるはずです: .map(res => res.json().data)

于 2016-04-02T05:41:56.163 に答える