【问题标题】:Is it possible to handle unknown properties when creating a TS class instance from JSON?从 JSON 创建 TS 类实例时是否可以处理未知属性?
【发布时间】:2020-03-01 21:54:48
【问题描述】:

将普通对象从 JSON 转换为类实例时,我需要一种方法 捕获所有没有对应类属性的属性并存储它们 在某个地方(以下示例中的附加数据)。

我查看了一些库(class-transformermarshal.tsTypedJSON) 但似乎没有办法做我想做的事。

下面是我想要实现的假设示例(它使用 class-transformer,但任何其他反序列化器库都可以为我工作)

// model/DailyStatsRecord.ts
export class DailyStatsRecord {
    public uuid: string;
    public date: string;

    public additionalData: any;
}
// index.ts
import "reflect-metadata";
import {plainToClass} from "class-transformer";
import {DailyStatsRecord} from './model/DailyStatsRecord';

const instance = plainToClass(DailyStatsRecord, {
    uuid: "faf9a028-5bbe-11ea-bc55-0242ac130003",
    date: "2020-03-01",
    otherField: 123,
    more: ["data"],
    foo: "bar",
});

console.log(JSON.stringify(instance.additionalData, null, 2));

这是我希望此脚本输出的内容:

{
  "otherField": 123,
  "more": ["data" ],
  "foo": "bar"
}

【问题讨论】:

    标签: node.js typescript class-transformer


    【解决方案1】:

    这可以在没有任何第三方库的情况下完成,但是您必须使用对象解构手动提取已知属性,并为其他人收集休息集合,并让构造函数获取一个参数,该参数是一个对象剩余的键/值:

    type POJO = {
      [key: string]: any
    };
    
    class HasExtra {
      public foo: string;
      public bar: number;
      public rest: POJO;
      constructor(foo: string, bar: number, rest: POJO) {
        this.foo = foo;
        this.bar = bar;
        this.rest = rest;
      }
    }
    
    const dataFromJSON = {
      foo: "hi",
      bar: 3,
      baz: true,
      qux: null,
    }
    
    const {
      foo,
      bar,
      ...rest
    } = dataFromJSON;
    
    const instance = new HasExtra(foo, bar, rest);
    console.log(instance.rest); // logs { baz: true, qux: null }
    

    Link to playground

    【讨论】:

    • 谢谢。我认为可能有更干净和透明的方式来处理这个问题,比如一些魔术注释或其他什么
    • @CxMezz 没问题。 TypeScript 必须在提供合理数量的类型安全性(值得采用成本)和提供合理数量的动态性(以降低采用成本)之间走一条细线。
    猜你喜欢
    • 2019-01-08
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多