Можно ли обрабатывать неизвестные свойства при создании экземпляра класса TS из JSON?
При преобразовании простого объекта из JSON в экземпляр класса мне нужен способ перехватывать все свойства, не имеющие соответствующих свойств класса, и хранить их в каком-либо месте (additionalData в примере ниже).
Я заглянул в некоторые библиотеки ( class-transformer, marshal.ts, TypedJSON), но, похоже, нет возможности делать то, что я хочу.
Ниже приведен гипотетический пример того, чего я хотел бы достичь (он использует преобразователь классов, но для меня подойдет любая другая библиотека десериализатора)
// 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"
}
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 }