Что такое шаблон для использования Typescript с JSON?

avatar
Pavan Kumar
9 августа 2021 в 05:57
94
1
1

В приложении TypeScript нам может потребоваться обрабатывать данные в форме JSON. Допустим, у нас есть следующая структура данных.

{ "x": 5, "y": 20 }

Мы хотим иметь функцию distanceFromOrigin для вышеуказанных данных. Я думаю, мы можем сделать это двумя способами.

Подход 1

class Point {
    x: number = 0;
    y: number = 0;

    constructor(init?: Partial<Point>) {
        Object.assign(this, init);
    }

    distanceFromOrigin() {
        return Math.hypot(this.x, this.y);
    }
}

const jsonFromReqest1 = { "x": 5, "y": 20 };
const point = new Point(jsonFromReqest1);

console.log(point.distanceFromOrigin())

Приведенная выше реализация выглядит красиво. Недостатки:

  1. Требуется конструктор, который принимает JSON и создает объект. Это станет сложным, если объект имеет вложенный объект и массив.
  2. Каждое место, где мы извлекаем объект JSON, нам нужно убедиться, что мы вызываем конструктор и преобразуем его в объект.

Подход 2

interface IPoint {
    x: number;
    y: number;
}

const PointService = {
    distanceFromOrigin(point: IPoint) {
        return Math.hypot(point.x, point.y);
    }
}

const jsonFromReqest2 = { "x": 5, "y": 20 };
console.log(PointService.distanceFromOrigin(jsonFromReqest2));

Приведенный выше подход не имеет недостатков Approach 1. Но,

  1. Он не выглядит объектно-ориентированным.
  2. Это многословно, как будто нам нужно написать PointService.distanceFromOrigin, очень длинную строку.

Есть ли какие-либо другие convenience и/или downsides, кроме тех, которые я упомянул, что указывает на то, что Approach 1 или Approach 2 лучше.

Источник
Evert
9 августа 2021 в 07:03
0

Javascript — это не Java, во втором примере нет необходимости оборачивать функцию в объект, вы можете просто определить функцию. Я думаю, что вы предпочитаете, в основном субъективно. Все действительны.

Pavan Kumar
9 августа 2021 в 10:01
0

@Evert Да, верно. Я чувствую, что PointService.distanceFromOrigin() более читабелен, я буду знать, что distanceFromOrigin имеет какое-то отношение к Point. Кроме того, при написании кода я должен помнить объекты верхнего уровня, такие как Point, и когда я пишу PointService. в IDE, он предлагает все связанные функции.

Evert
9 августа 2021 в 15:40
0

Я бы сказал, что более идиоматично не делать это, а просто экспортировать все по отдельности. Это также потенциально дает вам более оптимизированные сборки, поскольку делает возможным встряхивание деревьев.

Ответы (1)

avatar
everythinginplace
9 августа 2021 в 06:02
1

Есть еще один подход, заключающийся в использовании сторонней библиотеки для создания полноценных объектов из вашего объекта. Например, класс-трансформер.

https://github.com/typestack/class-transformer