使用通用TypeScript减少嵌套JSON

时间:2018-03-25 02:13:05

标签: typescript generics interface

我有以下JSON。

{"results":
  {"data": {
    "id":"93cba9bd-2969-3214-b26f-7f42d20241a4",
    "first_name":"PSU",
    "last_name":"Bot",
    "profile": {
        "data":{"about":"i am so happy",}
     }
  }
}

现在我从API获取数据了。我想反序列化它,以便具有以下定义的模型:

export class Person extends BaseModel {
    first_name: string;
    last_name: string;
    profile: DataType<Profile>;
}

没有数据元素会有个人资料属性。

如何构建通用DataType以便实现此目的?这是我到目前为止所拥有的。

export class DataType<T> {

public constructor(arg: T) {
    console.log(arg);
    return new arg.data;
  }
}

此外,这是一个泛型类型区域还是一个对象(类),如上例所示?

2 个答案:

答案 0 :(得分:0)

关于嵌套逻辑,你可以这样做。

export class DataType<T> {
  public constructor(public data: T) {}
}

或者委托它。

export class DataType<T> {
  public data: T;

  public constructor(obj: {"data":T}) {
    this.data = obj.data;
  }
}

答案 1 :(得分:0)

假设您确定您的profile属性或替换它的任何其他值将具有data属性,您可以定义以下泛型类来建模响应的这一部分:

export class DataType<T extends { data: any }> {
    public data: any;

    public constructor(arg: T) {
        this.data = arg.data;
    }

    public toJSON(): any {
        return {
            data: this.data,
        };
    }
}

请注意,toJSON方法不是必需的,但如果您在此对象或封闭对象上调用JSON.stringify,则非常有用。使用此方法,您可以根据需要操作输出。