Когда использовать интерфейс и модель в 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-адреса и привязать к интерфейсу/модели. Иногда мне нужен один объект данных, в другое время я хочу провести и массив объекта.
Какой я должен использовать и почему?
Ответы
Ответ 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 руководства по стилю
В основном, класс может делать все, что будет делать интерфейс. Поэтому, возможно, никогда не потребуется использовать интерфейс.