2017-12-15 21 views
0

角度4、5でスピードアップし、強力な型指定されたオブジェクト/モデルにJSON応答をマッピングするためのベストプラクティスが不思議でした。モデルへの対応マッピング - ベストプラクティス

サービス:

getUsers(): Observable<User[]> { 
    return this.http.get<User[]>('http://localhost:8000/users/') 
    .pipe(
     tap(users => this.log(`fetched users`)), 
     map(response => { 
     return response.map((res) => 
     { 
      return new Hero(
      response['username'], 
      response.email); 
     }); 
     }), 
     catchError(this.handleError('getUsers', [])) 
    ); 
} 

インタフェース/モデル:

export interface IUser { 

    id: number; 
    name: string; 
    email: string; 
} 

export class Hero implements User { 

    public id: number; 

    constructor(public name: string, 
      public email: string) { 

    } 
} 

リターンユーザーオブジェクトで観察アレイ。 usernameはそのオブジェクトのメンバーではありませんので、この表記法を使用すると、ドット表記法でエラーが発生するためです。明らかに、私は最終的に、そのMap関数をテスト容易性/明快さのための別個の関数に持っていきます。

このマッピング/再マッピング/トランスフュージョンを正しく処理するにはどうすればよいですか?

+0

'return response' – Aravind

+0

あなたは直接' 'map(response => return return response)'を意味します。 '' username'は '' name'にどのようにマップされますか?基本的にこの簡単な例で私の質問です。 –

答えて

0

あなたはあまりにも多くの問題を抱えています。

export interface IUser { 
    id: number; 
    username: string; 
    email: string; 
} 

getUsers(): Observable<User[]> { 
    return this.http.get<User[]>('http://localhost:8000/users/') 
    .catch(err => this.handleError('getUsers', [])); 
} 

ここでは、あなたの応答が入力されます。

developping helpと入力文字を参照してください。コーディング中にクラスなどを持つことは非常に便利ですが、アプリケーションをビルドすると、すべてがJavascriptにコンパイルされ、すべてのクラスとプロパティが失われます。

あなたはあまりにもそれを考えるべきではありません。一番簡単なところに行って、うまくいくはずです。それ以外の場合は、エラーがどこにあるかを教えてくれるTSリンターがまだあります!

+0

これは、より複雑なものが登場し、FE上に異なるプロパティ名を持つRESTfulなAPIであることを考えると非常に簡単な例です。私は理解し、あなたに同意します。私はマッピングのためのこのベストプラクティス実装を探しています。 –

+0

「マッピングのベストプラクティス実装」はありません。**データを変更する必要がある場合はマッピングを使用します**。すべての呼び出しでモデルに合わせてレスポンスをマッピングする必要がある場合は、**レスポンスモデルに対応するようにモデルを変更します**。 'get 'とあなたの関数を 'Observable 'と入力してください。さもなければ、新しい要素をインスタンス化する必要はありません。それは時間、リソース、コード行を無駄にしています。 – trichetriche

関連する問題