Type-алиасы и их отличие от интерфейсов
Второй способ давать типам имена — и когда он удобнее интерфейса.
Type alias — имя для любого типа, задаётся ключевым словом
type:type ID = string | number.
type alias
Псевдоним типа создаёт имя для типа — любого, не только объекта. Объект через type описывается почти так же, как интерфейсом:
type User = {
name: string;
age: number;
};
const anya: User = { name: "Аня", age: 30 };
Для формы объекта type и interface взаимозаменяемы. Но type умеет больше: он даёт имя любому типу.
Что умеет только type
Псевдоним удобен для union- и литеральных типов, кортежей, типов функций — там, где interface не применишь:
type ID = string | number; // union
type Direction = "up" | "down" | "left"; // литералы
type Point = [number, number]; // кортеж
type Handler = (event: string) => void; // функция
Интерфейсом ни один из этих типов описать нельзя — interface предназначен только для формы объекта (и классов).
Главное отличие: расширяемость
Интерфейс можно объявить повторно, и объявления сольются (declaration merging). У псевдонима так не выйдет — повторное объявление с тем же именем будет ошибкой:
interface Box { width: number; }
interface Box { height: number; }
// Box теперь = { width: number; height: number } — объявления слились
type Cup = { width: number; };
type Cup = { height: number; };
// Ошибка: Duplicate identifier 'Cup'.
Слияние интерфейсов используют библиотеки, чтобы пользователь мог дополнять их типы. Для обычного кода это редко нужно, но объясняет, почему для публичных API часто выбирают interface.
Сравнение
| Возможность | interface | type |
| Форма объекта | да | да |
| Union / литералы | нет | да |
| Кортежи, типы функций | ограниченно | да |
| Слияние объявлений | да | нет |
Что выбирать
На практике работает простое правило:
- Описываете форму объекта или публичный контракт — берите
interface(читается привычно, расширяем). - Нужен union, литерал, кортеж или тип функции — только
type.
Главное — не смешивать стили хаотично в одном проекте. Многие команды используют interface для объектов и type для всего остального.
Итог
typeдаёт имя любому типу: union, литералам, кортежам, функциям.interfaceописывает только форму объекта, зато поддерживает слияние объявлений.- Для объектов оба подходят; для union и подобного — только
type.