【问题标题】:Reduce nested JSON using generic TypeScript使用通用 TypeScript 减少嵌套 JSON
【发布时间】:2018-03-25 02:13:05
【问题描述】:

我有以下 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>;
}

会有它的 profile 属性没有数据元素。

如何构造一个通用的 DataType 以便实现这一点?这是我目前所拥有的。

export class DataType<T> {

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

另外,这是一个泛型类型领域还是上面示例中的对象(类)?

【问题讨论】:

  • 您的代码中是否有类型/接口Profile 的定义?尚不清楚DataType 类的目的是什么。能详细点吗?
  • 数据类型是封装符合相同嵌套结构的响应,即它们嵌套在对象内的数据命名空间下

标签: typescript generics interface


【解决方案1】:

关于你可以做的嵌套逻辑。

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;
  }
}

【讨论】:

  • 这会让 json 像这样:{"results": {"data": { "id":"93cba9bd-2969-3214-b26f-7f42d20241a4", "first_name":"PSU", "last_name":"Bot", "profile": { "about":"i am so happy" } } }
【解决方案2】:

假设您确定您的 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,则很有用。使用此方法,您可以随意操作输出。

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2019-10-16
    相关资源
    最近更新 更多