Angular2&Typescript-从嵌套JSON创建对象

Angular2&Typescript-从嵌套JSON创建对象,json,angular,inheritance,typescript,Json,Angular,Inheritance,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,

我有一个类,其中包含多个接口,用于对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的实例吗?

您的数据结构与您的类几乎相同,您必须向该类添加一个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
    }
}
或者,您可以通过组合类的现有实例并传播json来创建该类型的变量

像这样:

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();

首先,接口有id字段,MyClass实现了它,我应该再次声明它吗?其次,我有比这个例子多得多的接口/类,所以用一个需要json的构造函数启动所有接口/类会花费太多时间。最后,我尝试创建一个没有方法的类的实例:AClass={…},但当我这样做时,AClass的实例返回false。您建议的第二种方法是创建此类的真实实例,还是将其保持为json?