Пошук уроків, статей та іншого контенту
Дві схожі, але не тотожні мовні конструкції для опису форми даних — практичні відмінності.
type створює псевдонім — зручне ім'я для будь-якого типу, не лише форми об'єкта (як interface з попереднього уроку), а й union-типу, кортежу, примітиву чи навіть функції:
type UserId = string;
type Status = "active" | "inactive" | "banned"; // union — interface так не може
type Point = [number, number]; // псевдонім для кортежу
type User = {
id: UserId;
status: Status;
};Interface підтримує декларативне злиття (declaration merging) — кілька окремих оголошень interface з тим самим іменем автоматично об'єднуються компілятором в одне; type alias із тим самим іменем оголосити двічі — помилка компіляції:
interface User {
id: string;
}
interface User {
name: string; // додає поле до ТОГО САМОГО interface User
}
// User тепер має обидва поля: { id: string; name: string }
type Product = { id: string };
// type Product = { title: string }; // помилка: Product уже оголошеноОбидві конструкції вміють комбінувати типи, різним синтаксисом: interface через extends, type через оператор перетину &:
interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}
type AnimalType = { name: string };
type DogType = AnimalType & { breed: string }; // той самий результат через перетинinterface — типовий вибір для форми об'єкта чи класу, особливо в публічному API бібліотеки/модуля, де споживачі можуть захотіти доповнити тип (declaration merging).
type — обов'язковий вибір, коли потрібен union, кортеж, псевдонім примітиву чи будь-яка комбінація, що не є просто формою об'єкта.
Для звичайної форми об'єкта без потреби в об'єднанні декларацій — обидва варіанти на практиці взаємозамінні; послідовність у межах команди важливіша за «правильний» вибір одного з двох.
Ця відмінність — не суто академічна: значна частина типів у бібліотеках React і Node.js історично описана через interface саме через можливість declaration merging (наприклад, розширення стандартних типів довільними додатковими полями) — розуміння цього механізму допомагає розуміти чому типи деяких бібліотек написані саме так.
Спроба оголосити union-тип через interface — interface описує форму об'єкта, а не довільну комбінацію типів; для union потрібен саме type.
Ненавмисне декларативне злиття двох interface з однаковим іменем, які насправді мали описувати різні речі, — компілятор мовчки об'єднує їх в один тип замість помилки, що плутає, коли це не було свідомим наміром.
Змішування стилів extends/& у команді без узгодженої конвенції — обидва технічно працюють, але непослідовність ускладнює читання кодової бази.
type — універсальний псевдонім для будь-якого типу, включно з union і кортежами; interface — спеціалізований опис форми об'єкта з підтримкою декларативного злиття кількох оголошень в одне. Обидва вміють комбінувати типи (extends проти &), і для простої форми об'єкта різниця здебільшого стилістична — головне тримати узгоджену конвенцію в межах проєкту.