Interface vs Type: что выбрать?
При работе с TypeScript, вы наверняка задавались вопросом: «Что использовать - interface или type?». Кажется, что они делают одно и то же, но под капотом скрываются нюансы, которые могут либо спасти ваш проект, либо докинуть задачек в беклог
Interface: Контракт для объектов
interface - это, прежде всего, описание структуры объекта. Это классический способ определения формы данных в ООП-стиле.
Главная фишка: Declaration Merging
Интерфейсы позволяют «дописывать» себя. Если вы объявите один и тот же интерфейс дважды, TypeScript автоматически их объединит.
interface User {
name: string;
}
interface User {
age: number;
}
// Итог: User теперь имеет и name, и age
const person: User = { name: "Alex", age: 25 };
Зачем это нужно?
Это идеально для расширения сторонних библиотек или глобальных объектов (например, добавление поля в window).
Type: более «гибкая» типизация
type - это более гибкий инструмент для типизации.
Он может быть не только объектом, но и псевдонимом для любого типа данных.
Главная фишка: Union и Intersection
Типы умеют то, что интерфейсам недоступно - логические операции.
type Status = "success" | "error" | "loading"; // Union тип
type ID = string | number;
type Point = { x: number };
type Dimension = { width: number };
// Пересечение (Intersection)
type Rect = Point & Dimension;
Что и когда выбирать?
- Используйте interface, когда:
- Вы описываете структуру объекта, который может расширяться.
- Вы пишете публичную библиотеку (чтобы пользователи могли мержить интерфейсы).
- Используйте type, когда:
- Нужны Union-типы (например, status: 'open' | 'closed').
- Вы работаете с кортежами (Tuples).
- Нужно создать алиас для примитива или сложной функции.
Исходя из своего опыта, могу сказать, что:
-
interface чаще используется для типизации объектов(type используется редко)
-
type чаще используется для примитивных типов, либо, в редких случая для приватноц типизации объектов в локальных местах для удобства (например:
Type1 | Type2 или Type1 & Type2)