В чем разница между `type` и `interface` в TypeScript?

Ответ

И type, и interface используются для описания форм объектов, но имеют ключевые различия в возможностях и сценариях использования.

interface:

  • Основная цель: Описание формы объекта, особенно в контексте ООП и контрактов.
  • Расширение: Использует ключевое слово extends.
    interface User {
      name: string;
    }
    interface Admin extends User {
      permissions: string[];
    }
  • Объявление слияния (Declaration Merging): Интерфейсы с одним именем автоматически объединяются. Это полезно для расширения типов из сторонних библиотек.
    interface Window {
      title: string;
    }
    interface Window {
      ts: TypeScriptAPI;
    }
    // Результат: Window { title: string; ts: TypeScriptAPI; }
  • Имплементация: Классы могут реализовывать (implements) интерфейсы.

type (псевдоним типа):

  • Основная цель: Создание псевдонима для любого типа, включая примитивы, объединения, пересечения и кортежи.
  • Расширение: Использует пересечение (&).
    type User = { name: string };
    type Admin = User & { permissions: string[] };
  • Продвинутые типы: Может определять типы, которые невозможно выразить через interface.
    // Union тип
    type Status = 'success' | 'error' | 'pending';
    // Tuple тип
    type Point = [number, number];
    // Mapped Types
    type Readonly<T> = { readonly [P in keyof T]: T[P] };

Что использовать?

  • Используйте interface, когда:
    • Работаете с объектами/классами в стиле ООП.
    • Вам может понадобиться объявление слияния (например, при написании деклараций).
  • Используйте type, когда:
    • Нужен union, intersection, mapped type или кортеж.
    • Определяете псевдоним для примитива.

На практике для описания объектов разница часто несущественна, и выбор может быть делом вкуса, но понимание этих различий важно для сложных сценариев.

Ответ 18+ 🔞

Слушай, а вот эта вечная тема про type и interface — это же классический спор, как «на чём лучше жарить яичницу: на сковородке или на тарелке?». Вроде и то, и то сработает, но нюансы, блядь, есть овердохуища.

Вот смотри, interface — это такой этакий формалист, любитель контрактов. Его главная фишка — описать, как должен выглядеть объект, особенно если ты в ООП ударился. Хочешь его расширить? Пожалуйста, ключевое слово extends к твоим услугам.

interface User {
  name: string;
}
interface Admin extends User {
  permissions: string[];
}

А ещё у него есть суперсила — объявление слияния. Это когда ты можешь объявить Window в одном месте, потом в другом файле добавить к нему поля, и они склеятся в одну кучу. Для библиотек — просто находка, ёпта.

interface Window {
  title: string;
}
interface Window {
  ts: TypeScriptAPI;
}
// Итог: Window { title: string; ts: TypeScriptAPI; } — всё в одном флаконе.

Ну и конечно, классы могут его реализовывать через implements. Всё чинно, благородно.

А теперь type, он же псевдоним типа. Это такой универсальный солдат, мастер на все руки. Ему похуй, что описывать: объект, примитив или какую-нибудь ебанутую конструкцию. Расширяется он через пересечение (&), что тоже выглядит логично.

type User = { name: string };
type Admin = User & { permissions: string[] };

Но где он реально вырывается вперёд, так это в продвинутых типах. С ним можно творить вещи, от которых interface просто встанет в ступор, как мартышлюшка перед бананом в бутылке.

// Union тип — выбирай один
type Status = 'success' | 'error' | 'pending';
// Кортеж — массив с жёсткой структурой
type Point = [number, number];
// Mapped Types — магия преобразования
type Readonly<T> = { readonly [P in keyof T]: T[P] };

Так что же выбрать, чувак?

  • Тащи interface, если:
    • Ты за классическое ООП с классами и контрактами.
    • Тебе может пригодиться волшебное слияние объявлений (часто в декларациях типов).
  • Херачь type, если:
    • Нужен union, intersection, mapped type или кортеж. Тут без вариантов.
    • Просто даёшь имя какому-нибудь примитиву или сложному вычисляемому типу.

По правде говоря, для описания обычных объектов разница — хуй с горы. Можно хоть монетку кидать. Но когда дело доходит до сложных сценариев, понимание этих различий — это как знать, где у машины аварийный тормоз. Пригодится в самый неожиданный момент.