Коли використовувати інтерфейс та модель в TypeScript / Angular2


198

Нещодавно я переглядав Підручник по 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-адреси та прив'язати до інтерфейсу / моделі. Колись я хочу один об'єкт даних, інший час я хочу утримувати і масив об'єкта.

Який я повинен використовувати і чому?


14
Використовуйте клас, коли вам потрібна спеціальна логіка init, інакше завжди використовуйте інтерфейс, оскільки це доступно лише під час компіляції. Інтерфейс машинопису не компілюється в javascript, оскільки він не існує в JavaScript.
Дітерг

6
Майте на увазі, що інтерфейси НЕ працюватимуть із введенням залежності в Angular 2. Тут вам доведеться використовувати класи.
jlang

Відповіді:


137

Інтерфейси є лише під час компіляції. Це дозволяє лише перевірити, чи очікувані отримані дані відповідають певній структурі. Для цього ви можете передавати свій вміст на цей інтерфейс:

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);
      });
    });

27
Дякуємо за детальну відповідь. Якщо інтерфейс використовується лише під час компіляції, як компілятор може перевірити структуру файлу JSON, не вивчаючи фактично http? Якщо це не вдається, то який сенс навіть турбуватися з інтерфейсом?
I_LIKE_FOO

7
@I_LIKE_FOO компілятору не потрібно перевіряти отримання дзвінка. Дбає лише про те, щоб перевірити типи, про які він знає, та правильність їх вирівнювання. var data = res.json();насправді var data: any = res.json();до компілятора, тому ми втрачаємо перевірку всіх типів data. Що корисніше було б тут було б що - щось на зразок var data: ProductDto[] = res.json();з ProductDtoтим інтерфейсом , який моделює структуру даних в повернутому JSON.
GFoley83

3
Детальніше: Angular style guide says not to use interfaces.Always use classes.Див angular.io/guide/styleguide#style-03-03
Сампатх

4
Так, але проблема полягає в тому, що вони не є богами-гуру, які створили Typescript. Це були б Microsoft та компанія. Вони, як правило, надають перевагу інтерфейсам та класам, коли це доречно. Також бонусні бали ... один - час виконання, а інший - під час збирання
Том Стікель,

11
@Sampath Можливо, посібник зі стилів у кутовому стилі було оновлено, як я бачу це "Розгляньте можливість використання інтерфейсу для моделей даних." Імпліє віддають перевагу інтерфейсу над класом для моделей даних.
Mikezx6r

40

Інтерфейс описує або контракт на клас або новий тип . Це чистий елемент Typescript, тому він не впливає на Javascript.

Модель, а саме клас , є фактичною функцією JS, яка використовується для генерації нових об'єктів.

Я хочу завантажити дані JSON з URL-адреси та прив'язати до інтерфейсу / моделі.

Перейдіть за моделлю, інакше вона все ще буде JSON у вашому Javascript.


4

Як сказав @ThierryTemplier для отримання даних з сервера, а також для передачі моделі між компонентами (щоб зберегти список інтелігенції та зробити помилку в часі проекту), добре використовувати інтерфейс, але я думаю, що для надсилання даних на сервер (DTO) краще використовувати клас, щоб взяти переваги автоматичного відображення DTO від моделі.


-22

Використовуйте Class замість інтерфейсу , саме це я виявив після всіх своїх досліджень.

Чому? Сам клас менше коду, ніж інтерфейс класу плюс. (у будь-якому випадку вам може знадобитися клас для моделі даних)

Чому? Клас може виступати в якості інтерфейсу (використовувати реалізації замість розширень).

Чому? Клас інтерфейсу може бути маркером пошуку постачальника при введенні кутової залежності.

з посібника з кутового стилю

В основному клас може робити все, що буде робити інтерфейс. Тому ніколи не потрібно використовувати інтерфейс .


10
Наразі посібник із кутового стилю фактично говорить: “ Подумайте про використання інтерфейсу для моделей даних.
Алекс Пітерс

@AlexPeters Будь ласка, надайте будь-яке справжнє посилання. Дякую заздалегідь
Ананд Фадке

@AnandPhadke впевнений, ось посилання Machine Wayback на посібник з кутового стилю приблизно з мого часу коментаря вище.
Алекс Петерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.