0.1.1 • Published 2 years ago

mapper-dto v0.1.1

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

mapper-dto

Библиотека для преобразования объектов, данных к заданной структуре. Реализованы два API.

  • Десериализации объекта. Преобразовывает объект cо схожей структурой. При десериализации можно переименовать поля и часть полей опустить (не копировать)
  • Маппинг плоского списка. Преобразовывает плоский список в объект с древовидной структурой.

Примеры использования

Десериализация

Предположим, что мы в клиенте для описания данных используем следующие интерфесы:

interface IAddress {
  id: number
  street: string
  flat: string
}

interface IPerson {
  email: string
  name: string
  secondName: string
  address: IAddress
}

С сервера приходит следующая структура:

{
  "email": "something@email.com",
  "name": "Ivan",
  "second-name": "Ivanov",
  "address": {
    "id": 1,
    "street": "Lenina",
    "house": "22/5"
  }
}

Как видно из примера, в получаемой структуре данных есть отличия по именованию полей. С помощью API MapUtils.deserialize можно привести структуру к нужному виду. Для этого нужно создать классы, реализующие нужные интерфесы.

import {JsonProperty, Id} from "mapper-dto";

class Address implements IAddress {
  @Id()
  id: number
  @JsonProperty('house')
  flat: string
  street: string

  constructor(id: number, flat: string, street: string) {
    this.id = id
    this.flat = flat
    this.street = street
  }
}

class Person implements IPerson {
  @Id()
  email: string
  name: string
  @JsonProperty('second-name')
  secondName: string
  @JsonProperty('address') // Для не примитивных типов данных всегда добавлять декоратор JsonProperty
  address: Address

  constructor(email: string, name: string, secondName: string, address: Address) {
    this.email = email
    this.name = name
    this.secondName = secondName
    this.address = address
  }
}

Пример применение:

import {MapUtils} from "mapper-dto";

function fun() {
  const response = axios.get('something_url')
  const data = MapUtils.deserialize(Person, response.data)
}

Маппинг

У нас тот же интерфейс и теже классы, но входные данные имеют следующий вид:

[
  {
    "email": "something@email.com",
    "name": "Ivan",
    "second-name": "Ivanov",
    "id": 1,
    "street": "Lenina",
    "house": "22/5"
  }
]

Для приведения этой структуры к нужному нам интерфесу досточно воспользоваться MapUtils.mapping.

Пример:

import {MapUtils} from "mapper-dto";

function fun() {
  const response = axios.get('something_url')
  const data = MapUtils.mapping(Person, response.data) // data будет массивом объектов с типом Person
}