Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чому інтерфейси частіше застосовуються для об'єктів?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Інтерфейси** спочатку створені для того, щоб **описувати форму об'єктів**: TypeScript розроблявся як надбудова над JavaScript, де майже все є об'єктом (функції, класи, дані, модулі). **Ключове:** інтерфейс каже TypeScript, що об'єкт, який відповідає цьому контракту, повинен мати такі поля і типи.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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**, яка будується навколо об'єктних структур.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.