Можно ли обрабатывать неизвестные свойства при создании экземпляра класса TS из JSON? - PullRequest
1 голос
/ 01 марта 2020

При преобразовании простого объекта из JSON в экземпляр класса мне нужен способ перехватить все свойства, не имеющие соответствующих свойств класса, и сохранить их в каком-то месте (AdditionalData в примере ниже).

Я заглянул в некоторые библиотеки ( class-transformer , marshal.ts , Typed JSON), но, похоже, нет никаких средств делать то, что я хочу.

Ниже приведен гипотетический пример того, чего я хотел бы достичь (он использует преобразователь класса , но любая другая библиотека десериализатора будет работать для меня)

// 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 Ответ

1 голос
/ 01 марта 2020

Это может быть выполнено без каких-либо сторонних библиотек, но вам придется вручную извлекать известные свойства, используя деструктуризацию объектов с остальными, а конструктор должен принимать параметр, который является объектом с оставшиеся ключи / значения:

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 }

Ссылка на игровую площадку

...