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.

Сравнение

Возможностьinterfacetype
Форма объектадада
Union / литералынетда
Кортежи, типы функцийограниченнода
Слияние объявленийданет

Что выбирать

На практике работает простое правило:

  • Описываете форму объекта или публичный контракт — берите interface (читается привычно, расширяем).
  • Нужен union, литерал, кортеж или тип функции — только type.

Главное — не смешивать стили хаотично в одном проекте. Многие команды используют interface для объектов и type для всего остального.

Итог

  • type даёт имя любому типу: union, литералам, кортежам, функциям.
  • interface описывает только форму объекта, зато поддерживает слияние объявлений.
  • Для объектов оба подходят; для union и подобного — только type.
Проверьте себя
1. Что из перечисленного нельзя описать через interface, но можно через type?
AФорму объекта с двумя свойствами
BUnion-тип string | number
CОбъект с обязательными полями
DКонтракт для параметра функции
2. Что произойдёт при повторном объявлении interface Box с тем же именем?
AОшибка дублирования идентификатора
BОбъявления сольются (declaration merging) в один интерфейс
CВторое объявление заменит первое
DКомпилятор проигнорирует второе
3. Какое правило выбора между type и interface разумно на практике?
AВсегда использовать только type
Binterface — для формы объектов, type — для union, литералов, кортежей и функций
Cinterface быстрее, поэтому всегда interface
DВыбор не имеет значения никогда
Поддержать проект