Назад
Frontend

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)

2