node.js - 从 JSON 创建 TS 类实例时是否可以处理未知属性?

标签 node.js typescript class-transformer

当将普通对象从 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"
}

最佳答案

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

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

关于node.js - 从 JSON 创建 TS 类实例时是否可以处理未知属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60475560/

相关文章:

javascript - 将新行字符替换为\r

javascript - Angular 生产版本不能缩短类名吗?

javascript - Promise.all 在 AWS lambda 代码中不起作用

reactjs - 如何将 next/image 中的 Image 组件放在位置 : absolue

typescript - 如何在 NestJS Controller 中使用 DTO 的验证组?

node.js - 什么是 koa :sess. 信号?

javascript - 使用应用程序名称作为路由在本地主机中运行代码

javascript - 如何使用类转换器将 typescript 类转换为纯 javascript 对象

typescript - 请求正文中的 bool 参数在 NestJS api 中始终为真

javascript - 是否可以在 Socket.IO 中执行服务器端回调