Подтвердить что ты не робот

Когда использовать интерфейс и модель в TypeScript/Angular2

Недавно я просмотрел учебник по Angular 2 с TypeScript, но не знаю, когда использовать интерфейс и когда использовать модель для хранения структур данных.

Пример интерфейса:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

Пример модели:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

Я хочу загрузить данные JSON из URL-адреса и привязать к интерфейсу/модели. Иногда мне нужен один объект данных, в другое время я хочу провести и массив объекта.

Какой я должен использовать и почему?

4b9b3361

Ответ 1

Интерфейсы находятся только во время компиляции. Это позволяет только вам проверить, что ожидаемые полученные данные соответствуют определенной структуре. Для этого вы можете передать свой контент в этот интерфейс:

this.http.get('...')
    .map(res => <Product[]>res.json());

Смотрите следующие вопросы:

Вы можете сделать что-то подобное с классом, но основные отличия класса - это то, что они присутствуют во время выполнения (функция-конструктор), и вы можете определить методы в них с обработкой. Но в этом случае вам нужно создать экземпляр объектов, чтобы использовать их:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

Ответ 2

Интерфейс описывает либо контракт для класса, либо новый тип. Это чистый элемент Typescript, поэтому он не влияет на Javascript.

Модель, а именно класс, является реальной функцией JS, которая используется для генерации новых объектов.

Я хочу загрузить данные JSON из URL-адреса и привязать к интерфейсу/модели.

Пойдите для модели, иначе она все равно будет JSON в вашем Javascript.

Ответ 3

Как сказал @ThierryTemplier для получения данных с сервера, а также для передачи модели между компонентами (для сохранения списка intellisense и для ошибки времени проектирования), хорошо использовать интерфейс, но я думаю, что для отправки данных на сервер (DTO) лучше использовать класс для принятия Преимущества автокартирования DTO от модели.

Ответ 4

Используйте Class вместо Interface, это то, что я обнаружил после всех моих исследований.

Почему? Один класс - это меньше кода, чем класс плюс интерфейс. (в любом случае вам может потребоваться класс для модели данных)

Почему? Класс может выступать в качестве интерфейса (использовать реализации вместо расширений).

Почему? Интерфейсный класс может быть маркером поиска поставщика в внедрении зависимостей Angular.

из Angular руководства по стилю

В основном, класс может делать все, что будет делать интерфейс. Поэтому, возможно, никогда не потребуется использовать интерфейс.