класс против интерфейса для описания объекта - PullRequest
1 голос
/ 10 мая 2019

Как правильно описать объект в TypeScript (может быть, не только в TypeScript).Например, у меня есть запрос http, который возвращает мне объект, который имеет 2 параметра (имя и идентификатор).Я вижу 3 способа описать это.Первый - создать интерфейс

export interface MyObject {
  name: string;
  id: number;
}

Второй - создать класс

export class MyObject {
  public name: string;
  public id: number;
}

или тот же класс, но с геттерами и сеттерами

export class MyObject {
  private _name: string;
  private _id: number;

  public get name(): string {
    return this._name;
  }

  public set name(value: string) {
    this._name = value;
  }

  // similarly for id
}

Итак, что является наиболее понятным и правильным способом сделать это.Я в основном использую интерфейсы для описания объекта.Но я видел много проектов, в которых объекты описывались классами, каковы плюсы и минусы этих трех методов.Есть ли один самый правильный?

1 Ответ

0 голосов
/ 10 мая 2019

Например, у меня есть запрос http, который возвращает мне объект, который имеет 2 параметра (имя и идентификатор).Я вижу 3 способа описать это.

HTTP-запрос извлекает строку JSON, которая затем анализируется.

Динамический способ

Динамический способ заключается впросто используйте объект, созданный анализатором JSON.interface - это правильный инструмент для его описания:

export interface MyObject {
  name: string;
  id: number;
}

// …
const result = JSON.parse(await fetch(…)) as MyObject;

Тяжелый путь ООП

Здесь синтаксический анализатор JSON предоставляет тот же объект, что и ранее, но мы предпочитаем создать еще один.путем создания экземпляра класса:

export class MyObject {
  constructor(public name: string, public id: number) {
  }
}

// …
const { name, id } = JSON.parse(await fetch(…));
const result = new MyObject(name, id);

Максимально многословный способ ООП

То же самое с еще одним косвенным обращением с использованием сеттеров и геттеров:

export class MyObject {
  private _name: string;
  private _id: number;

  public get name(): string {
    return this._name;
  }

  public set name(value: string) {
    this._name = value;
  }

  public get id(): number {
    return this._id;
  }

  public set id(value: number) {
    this._id = value;
  }
}

// …
const { name, id } = JSON.parse(await fetch(…));
const result = new MyObject();
result.name = name;
result.id = id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...