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

«В чем разница между `type` и `interface` в TypeScript?» — вопрос из категории TypeScript, который задают на 30% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

И 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 или кортеж.
    • Определяете псевдоним для примитива.

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