Skip to main content

Чому інтерфейси частіше застосовуються для об'єктів?

1. Інтерфейси спочатку створені для опису структур об'єктів

TypeScript був розроблений як надбудова над JavaScript, де майже все - це об'єкти: функції, класи, дані, модулі. Тому інтерфейси спочатку призначалися, щоб описувати форму цих об'єктів.

javascript
interface User { id: number; name: string; isAdmin: boolean; }

Інтерфейс каже TypeScript: "Об'єкт, який відповідає цьому контракту, повинен мати такі поля і типи."


2. Інтерфейси - "контракти" для класів і модулів

Інтерфейс ідеально підходить для контрактів: він описує що об'єкт повинен містити, але не як він влаштований.

javascript
interface Logger { log(message: string): void; } class ConsoleLogger implements Logger { log(message: string) { console.log(message); } }

Інтерфейси створюють "договір" між класом і зовнішнім кодом: клас зобов'язаний реалізувати все, що описано в інтерфейсі.


3. Інтерфейси підтримують успадкування і розширення

Інтерфейси можна розширювати (extends) і об'єднувати (merging) - це зручно саме для об'єктних структур (DTO, API, сутності).

javascript
interface Entity { id: number; } interface User extends Entity { name: string; } interface Admin extends User { role: "admin"; }

Такі ієрархії часто трапляються в моделях даних (наприклад, користувачі, замовлення, товари). Тому інтерфейси - природний вибір для опису "об'єктних сутностей".


4. Інтерфейси вміють об'єднуватися автоматично (declaration merging)

Це вкрай корисно під час типізації бібліотек і API.

javascript
interface User { id: number; } interface User { name: string; } const user: User = { id: 1, name: "Tim" }; // Обидва інтерфейси злилися

type так не вміє - він видасть помилку при дублюванні. Тому інтерфейси частіше застосовуються для об'єктів і розширюваних сутностей (наприклад, Express.Request).


5. Інтерфейси логічно ближчі до "об'єктного мислення"

TypeScript - мова, де типізація і об'єктна модель ідуть пліч-о-пліч. Інтерфейс допомагає мислити об'єктно:

  • описує структуру (властивості, методи);
  • може бути реалізований класом (implements);
  • може бути розширений (extends);
  • не допускає union-логіки (на відміну від type).

Тому інтерфейс сприймається як "об'єктне креслення", а не просто "тип".


6. type - універсальний інструмент, але не об'єктно-орієнтований

type може описувати:

  • об'єднання (|),
  • перетини (&),
  • кортежі ([string, number]),
  • примітиви (string | number),
  • функції ((a: number) => string).
javascript
type Result = "success" | "error"; type Point = [number, number];

Але такі випадки - не об'єктні структури, і там type незамінний, а от у моделях даних та інтерфейсах класів - логічніше використовувати interface.


7. Тому на практиці:

СитуаціяЩо обратиЧому
Опис об'єкта або сутностіinterfaceГнучко, розширюваність, читабельність
Опис контракту класуinterfaceПідтримує implements
Типізація API-відповідей, DTO, моделейinterfaceМожна розширювати й об'єднувати
Union / перетин, кортежі, функціїtypeГнучкість і універсальність
Примітиви(string | number)type

Підсумок

Інтерфейси частіше застосовуються для об'єктів, тому що:

  1. Вони створені спеціально для опису структури об'єктів і класів.
  2. Їх можна розширювати (extends) і об'єднувати (merging).
  3. Вони природно інтегруються з ООП (implements).
  4. Вони самодокументовані і чудово читаються як "контракти даних".
  5. Вони - частина філософії TypeScript, яка будується навколо об'єктних структур.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.