← Назад к вопросам

Что используешь чаще, типы или интерфейсы?

1.0 Junior🔥 211 комментариев
#TypeScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы vs Интерфейсы в TypeScript

Это один из самых часто обсуждаемых вопросов в экосистеме TypeScript. После 10+ лет работы с фронтенд-кодом я выработал чёткую стратегию использования обоих подходов.

Мой выбор: интерфейсы как основной инструмент

Я использую интерфейсы в 70% случаев, особенно при описании структур данных, Props компонентов и контрактов. Вот почему:

Преимущества интерфейсов:

  • Декларативность — явно показывают, что это контракт
  • Слияние (declaration merging) — можно расширять в разных местах
  • Чуть лучше производительность при компиляции
  • Стандарт в экосистеме React
  • Удобнее для ООП-подхода
interface ButtonProps {
  variant?: "primary" | "secondary";
  disabled?: boolean;
  onClick: () => void;
  children: React.ReactNode;
}

interface User extends ButtonProps {
  id: string;
  name: string;
}

Когда использую типы (30% случаев)

Типы лучше для:

  • Union типов и условных типов
  • Дженерик утилит
  • Примитивов и алиасов
  • Функциональных сигнатур (type vs interface для функций — спорно, но type чище)
type Status = "loading" | "success" | "error";
type ResponseData<T> = T | null;
type AsyncFunction = (data: unknown) => Promise<void>;

Практический подход на проекте

Правило, которому я следую:

  1. Props компонентов → interface
  2. Возвращаемые значения функций → type
  3. API схемы → interface
  4. Union/условные типы → type
  5. Глобальные утилиты → type
// Components/Button.tsx
interface ButtonProps {
  variant?: "primary" | "secondary";
  size?: "sm" | "md" | "lg";
  children: React.ReactNode;
}

type ButtonVariant = ButtonProps["variant"];

export function Button({ variant = "primary", size = "md", children }: ButtonProps) {
  return <button className={`btn btn-${variant} btn-${size}`}>{children}</button>;
}

Почему это важно

Выбор между type и interface не просто синтаксис — это выбор явности и читаемости кода. Когда новый разработчик видит interface ButtonProps, он сразу понимает, что это контракт для компонента. Когда видит type— может быть неясно, это алиас, утилита или что-то ещё.

Но главное — консистентность в проекте важнее выбора. Команда должна договориться и придерживаться одного подхода, чтобы код был предсказуемым и удобным для чтения.