Чому інтерфейси частіше застосовуються для об'єктів?
1. Інтерфейси спочатку створені для опису структур об'єктів
TypeScript був розроблений як надбудова над JavaScript, де майже все - це об'єкти: функції, класи, дані, модулі. Тому інтерфейси спочатку призначалися, щоб описувати форму цих об'єктів.
interface User {
id: number;
name: string;
isAdmin: boolean;
}Інтерфейс каже TypeScript: "Об'єкт, який відповідає цьому контракту, повинен мати такі поля і типи."
2. Інтерфейси - "контракти" для класів і модулів
Інтерфейс ідеально підходить для контрактів: він описує що об'єкт повинен містити, але не як він влаштований.
interface Logger {
log(message: string): void;
}
class ConsoleLogger implements Logger {
log(message: string) {
console.log(message);
}
}Інтерфейси створюють "договір" між класом і зовнішнім кодом: клас зобов'язаний реалізувати все, що описано в інтерфейсі.
3. Інтерфейси підтримують успадкування і розширення
Інтерфейси можна розширювати (extends) і об'єднувати (merging) -
це зручно саме для об'єктних структур (DTO, API, сутності).
interface Entity {
id: number;
}
interface User extends Entity {
name: string;
}
interface Admin extends User {
role: "admin";
}Такі ієрархії часто трапляються в моделях даних (наприклад, користувачі, замовлення, товари). Тому інтерфейси - природний вибір для опису "об'єктних сутностей".
4. Інтерфейси вміють об'єднуватися автоматично (declaration merging)
Це вкрай корисно під час типізації бібліотек і API.
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).
type Result = "success" | "error";
type Point = [number, number];Але такі випадки - не об'єктні структури, і там
typeнезамінний, а от у моделях даних та інтерфейсах класів - логічніше використовуватиinterface.
7. Тому на практиці:
| Ситуація | Що обрати | Чому |
|---|---|---|
| Опис об'єкта або сутності | interface | Гнучко, розширюваність, читабельність |
| Опис контракту класу | interface | Підтримує implements |
| Типізація API-відповідей, DTO, моделей | interface | Можна розширювати й об'єднувати |
| Union / перетин, кортежі, функції | type | Гнучкість і універсальність |
| Примітиви | (string | number) | type |
Підсумок
Інтерфейси частіше застосовуються для об'єктів, тому що:
- Вони створені спеціально для опису структури об'єктів і класів.
- Їх можна розширювати (
extends) і об'єднувати (merging).- Вони природно інтегруються з ООП (
implements).- Вони самодокументовані і чудово читаються як "контракти даних".
- Вони - частина філософії TypeScript, яка будується навколо об'єктних структур.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.