2017-02-18 6 views
1

サーバーからデータを取得して、それをTypeScriptクラスに解析しています。私はいくつかの継承を使用しようとしています - すべてのクラスはその型を報告できる必要があります。それがどのように機能するか はここにあります:JSONの解析時にデータオブジェクトコンストラクタが呼び出されない

これは、基本クラス

import { PageElementType } from './page-element-type' 

export class PageElement { 
    pageElementType: PageElementType; 
    constructor(aPageElementType: PageElementType) { 
     this.pageElementType = aPageElementType; 
    } 
} 

あるこの派生クラスここで

import { PageElement } from './page-element.model' 
import { PageElementType } from './page-element-type' 

export class Metadata extends PageElement { 
    id: number; 
    body: string; 

    constructor(){ 
     super(PageElementType.metadata); 
    } 
} 

は、サービス機能は、私がデータを解析するために呼び出しのある

getExam(){ 
    let exam = this.http.get('http://orangeberry.hopto.org/api/Exam/1') 
    .map((response:Response) => <Exam>response.json()) 
    .do(data => console.log(data)); 
    return exam; 
} 

私は何らかの平凡なものを手に入れているようです。クラス定義に実際に従う有意義で機能的なオブジェクトが必要です。私の場合にこれを達成する最も単純で最も直接的な方法は何ですか?

+0

「Exam」のインスタンスが必要ですか? –

+0

はい。私のサンプルコードが誤っている場合は申し訳ありません。タイプ機能はExam自体ではなく、他のクラスで実装されています。試験には、メタデータオブジェクトの配列が含まれています。 –

答えて

1

キャストは静的コード解析のヒントに過ぎませんが、実行時には何の効果もありません。

あなたは値がクラスのインスタンスになりたい場合は、あなたがそのようなインスタンスを自分で作成する必要があります。

.map((response:Response) => new Exam(response.json())) 

Examクラスのコンストラクタは、そのプロパティにJSONを分解する。

+0

私は参照してください。ありがとう!デシリアライズのための4つのオプションを読んで、ここで指摘しました:http://stackoverflow.com/questions/22885995/how-do-i-initialize-a-typescript-object-with-a-json-object最後の選択肢は私にとって最高のもののようです。私のTypeScriptクラスの変数名はjsonフィールドと一致します。 jsonをpojoに解析して、Typescriptオブジェクトに値をクローンするための簡単な方法はありませんか? –

+0

JSONにネストされたオブジェクトがない場合、 'Object.keys(json).map(k => this [k] = json [k])'実際に私はTypeScriptを自分で使用していないので、この部分についてあまり気にしません。 –

+0

ええ、ネストされたオブジェクトはこの「自動化された」アプローチを防ぎます。ありがとうGünter! –

関連する問題