В приложении 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())
Приведенная выше реализация выглядит красиво. Недостатки:
- Требуется конструктор, который принимает JSON и создает объект. Это станет сложным, если объект имеет вложенный объект и массив.
- Каждое место, где мы извлекаем объект 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
. Но,
- Он не выглядит объектно-ориентированным.
- Это многословно, как будто нам нужно написать
PointService.distanceFromOrigin
, очень длинную строку.
Есть ли какие-либо другие convenience
и/или downsides
, кроме тех, которые я упомянул, что указывает на то, что Approach 1
или Approach 2
лучше.
Javascript — это не Java, во втором примере нет необходимости оборачивать функцию в объект, вы можете просто определить функцию. Я думаю, что вы предпочитаете, в основном субъективно. Все действительны.
@Evert Да, верно. Я чувствую, что
PointService.distanceFromOrigin()
более читабелен, я буду знать, чтоdistanceFromOrigin
имеет какое-то отношение кPoint
. Кроме того, при написании кода я должен помнить объекты верхнего уровня, такие какPoint
, и когда я пишуPointService.
в IDE, он предлагает все связанные функции.Я бы сказал, что более идиоматично не делать это, а просто экспортировать все по отдельности. Это также потенциально дает вам более оптимизированные сборки, поскольку делает возможным встряхивание деревьев.