ПрограммированиеFullstack разработчик

Расскажите об интерфейсах (interface) и типах (type alias) в TypeScript. Чем они различаются, в каких случаях выбирать тот или другой подход?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

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

  • Interface — классическое объявление интерфейса. Позволяет расширять интерфейсы, объединять (declaration merging), легко наследовать.
  • Type alias — создаёт новый псевдоним типа. Можно комбинировать с помощью union / intersection, присваивать любой сущности: примитивам, функциям, tuple и т.д.

Отличия:

  • Расширяемость: interface лучше для объектных структур, поддерживает декларативное объединение.
  • Гибкость: type alias универсален, подходит для всего: объединения (|) и пересечения (&).

Пример:

interface Animal { name: string } interface Dog extends Animal { bark(): void } // type alias для объединения типов: type MyType = string | number type Cat = Animal & { purr(): void }

Рекомендуется:

  • Для публичных API — использовать interface.
  • Для сложных объединений и alias-ов — использовать type.

Вопрос с подвохом.

Вопрос: Можно ли добавить новое поле к типу, определённому через type alias, в другом файле?

Ответ:

Нет. Type alias нельзя расширять декларативно из другого файла, в отличие от interface.

Пример:

// main.ts type User = { name: string } // another.ts type User = { age: number } // Ошибка: Duplicate identifier // interface: // main.ts interface User { name: string } // another.ts interface User { age: number } // Ок, User = { name: string, age: number }

Примеры реальных ошибок из-за незнания тонкостей темы.


История

На большом проекте определяли общие структуры данных через type alias. Когда понадобилось добавить поле существующему типу из другого пакета, оказалось, что type alias не поддерживает declaration merging — пришлось переписывать на interface, что вызвало задержки.


История

Один из разработчиков описал функции через interface, а затем попытался добавить Union тип (строку или функцию) — выяснилось, что interface для этого не подходит, и пришлось менять все определения на type alias с intersection/union.


История

После смены типа с interface на type alias перепутали синтаксис расширения: пытались использовать extends, вместо объединения через &. Ошибка проявилась поздно и не сразу поняли причину.