2017-12-04 4 views
0

私は複合型(複数型クラス)のjson応答オブジェクト(nodejs/mongooseバックエンドから受け取る)をtypescriptクラスにキャストしようとしています。角型5/Typescript - 複雑なjsonオブジェクトをクラスにキャストする方法

モーメントクラスには、タイプuserの著者とタイプcommentのコメント配列が含まれています。

moment.model.ts

import { Comment } from './comment.model'; 
import { User } from './user.model'; 

export class Moment { 

    _id?: string = null; 
    body?: string = null; 
    _author?: User = null; 
    likes?: any[] = []; 
    dislikes?: any[] = []; 
    _comments?: Comment[] = []; 
    created_at?: string = null; 
    updated_at?: string = null; 


    constructor(data?: Moment) { 
     console.log(data); 
     if (data) { 
      this.deserialize(data); 
     } 
    } 

    private deserialize(data: Moment) { 
     const keys = Object.keys(this); 

     for (const key of keys) { 
      if (data.hasOwnProperty(key)) { 
       this[key] = data[key]; 
      } 
     } 
    } 

    public get author(): User { 
     return this._author; 
    } 
    public set author(data: User) { 
     this._author = new User(data); 
    } 

    public get comments(): Comment[] { 
     return this._comments; 
    } 
    public set comments(data: Comment[]) { 
     this._comments = data.map(c => new Comment(c)); 
    } 
} 

comment.model.ts

export class Comment { 

    _id?: string = null; 
    body?: string = null; 
    moment?: any = null; 
    author?: any = null; 
    likes?: any[] = []; 
    dislikes?: any[] = []; 
    parent?: any = null; 
    replies?: any = null; 
    updated_at?: string = null; 
    created_at?: string = null; 

    constructor(data?: Comment) { 
     console.log(data); 
     if (data) { 
      this.deserialize(data); 
     } 
    } 

    private deserialize(data: Comment) { 
     const keys = Object.keys(this); 

     for (const key of keys) { 
      if (data.hasOwnProperty(key)) { 
       this[key] = data[key]; 
      } 
     } 
    } 

} 

user.model.ts

export class User { 

    _id?: string = null 
    updated_at?: string = null; 
    created_at?: string = null; 
    profile?: any = null; 
    phone?: any = null; 
    email?: any = null; 
    followers: any[] = []; 
    following: any[] = []; 
    isOnline: any = null; 
    socketId: any = null; 


    constructor(data?: User) { 
     console.log(data); 
     if (data) { 
      this.deserialize(data); 
     } 
    } 

    private deserialize(data: User) { 
     const keys = Object.keys(this); 

     for (const key of keys) { 
      if (data.hasOwnProperty(key)) { 
       this[key] = data[key]; 
      } 
     } 
    } 

moment.service.ts

get(moment_id) { 

    let endpoint = this.path + moment_id; 

    return this.apiService.get(endpoint) 
     .map((res) => new Moment(res.data)); 

} 

瞬間-detail.component.ts

this.route.params.switchMap((params) => { 
    let moment_id = params['id']; 
    return this.momentService.get(moment_id); 
}).subscribe((res) => { 

    this.moment = res; 
    console.log(this.moment); 
}); 

私は私は一瞬の新しいクラスにJSONを割り当てる私のサービスを呼び出す。コンポーネントでは、この部分を印刷してみます。著者と空白のコメントを除いて、すべてが問題ありません。

+0

'_author'は' User'型で、 'new User(data [key])'のように呼び出す場合にのみ_authorのメンバーに値が割り当てられます。それ以外の場合は、型の互換性のため、エラーが発生し、期待されるnullが返されます。 –

+0

あなたが瞬間の例を持ってきたら、もっと簡単にテストすることができます。あなたは思いませんか?また、私はあなたがjavascriptのラベルを消去する必要があると思うので、このコードではJavaScriptコードがありません(バックエンドとしてnode.jsを使用している場合でも)。好奇心のように、なぜコピーコンストラクタを使用するのですか(コンストラクタの内部を逆シリアル化します)?それは実際に必要ですか? – JTejedor

+0

@SantoshHegdeあなたは私がその問題を理解していると思っています、そこへの解決策はありますか? – KHAN

答えて

1

Momentであなたのdeserialize方法は、すべてのフィールドを同じように処理し、ちょうどJSONから値をコピーしているような何かを試すことができます。これは、UserまたはCommentオブジェクトを構築しないことを意味します。ループを使用する代わりに、それぞれのプロパティを正しく処理するために、 "手作業で"記述するべきでしょう。

+0

はい、ゲッターやセッターは必要ありません。クラスを再構築するだけです。私はちょうどそれがいかに効率的であるか考えています。 – KHAN

+0

どんな意味で効率的ですか?このようなものの実行時の効率を心配することはほとんどありません。保守性を考慮することが重要です。 –

+0

申し訳ありませんが、私が意味することは、リファクタリングしようとしているのですが、コンポーネントに散在する代わりにモデルにモーメントに関連する機能をいくつか持っています。 – KHAN

1

あなたは

this[key]=(key=='_author' ? new User(data[key]):(key=='_comments'?new Comment(data[key]): data[key]))

それとも

if(key=='_author') 
    this[key]=new User(data[key]); 
else if(key=='_comments') 
    this[key]=new Comment(data[key]); 
else 
    this[key]=data[key] 
+0

ありがとう、これは正しい解決策ですが、それは私を助けました – KHAN

+0

あなたのコードを書き直す方が良いです。それはよく書かれていません。 –

関連する問題