2017-02-08 9 views
0

JSONデータをモデル化するために、内部に複数のインターフェイスを持つクラスがあります。たとえば、次のようにAngular2&Typescript - ネストされたJSONからオブジェクトを作成

interface A { 
    id: number; 
} 

interface B { 
    name: string; 
    surname?: string; 
} 

class MyClass implements A { 
    people: B[]; 
    notes: string[]; 

    function1(){...} 
    function2(){...} 
} 

と私は同じ構造でJSONを持っている:

{ 
    id: 1, 
    people: [ 
    { 
     name: "john" 
    }, 
    { 
     name: "alice", 
     surname: "smith" 
    } 
    ], 
    notes: [ "Very important top secret note" ] 
} 

は私が直接、このJSONからMyClassのインスタンスを作成することはできますか?

答えて

1

あなたのデータ構造は、ほぼあなたのクラスと同じである、あなたがクラスにidプロパティを追加する

class MyClass implements A { 
    id: number; 
    // .... 
} 

を持っていると思いますが、このような何かをしようとしていた場合、問題がある:

let data: MyClass = { 
    id: 1, 
    people: [ 
    { 
     name: "john" 
    }, 
    { 
     name: "alice", 
     surname: "smith" 
    } 
    ], 
    notes: [ "Very important top secret note" ] 
} 

jsonにメソッド(function1、function2)がないため、これは機能しません。

一つの解決策は、実際のMyClassのインスタンスを作成し、JSONを渡すか、

class MyClass { 
    static createFrom(jsonData: A & B): MyClass { 
     // create the objct and return 
    } 
} 

のようにそのためのコンストラクタメソッドを持っているか、あなたはの既存のインスタンスを組み合わせることにより、その型の変数を作成することができますすることです

クラスを広げ、ジェソンを広める。そのよう

:まず

let json = { 
    id: 1, 
    people: [ 
     { 
      name: "john" 
     }, 
     { 
      name: "alice", 
      surname: "smith" 
     } 
    ], 
    notes: ["Very important top secret note"] 
} 
const c = new MyClass(); 

let mClass: MyClass = {...json, function1: c.function1, function2: c.function2 }; 

mClass.function1(); 

Link to playground

+0

は、インタフェースが 'id'フィールドを持ち、' ​​MyClass'はそれを実装して、私は再びそれを宣言する必要がありますか?第2に、私はこの例よりもはるかに多くのインターフェース/クラスを持っているので、jsonをとるコンストラクターですべてを開始するには時間がかかります。最後に、 'a:AClass = {...}'のようなメソッドを持たないクラスのインスタンスを作成しようとしましたが、そのときAClassのインスタンスがfalseを返しました。あなたが提案した2番目のメソッドは、このクラスの実際のインスタンスを作成するのですか、それとも単に 'json'として保持していますか? –

関連する問題