Дублируют ли друг друга type и interface в TypeScript?
Типы и интерфейсы
Частично да: для описания объектов type и interface взаимозаменяемы. Но у каждого есть то, чего нет у другого.
Где пересекаются
interface A { x: number }
type B = { x: number };Оба подходят для объектов, функций, implements в классах, расширения (extends у интерфейса, & у типа).
Чем отличаются
- Только `type`: объединения, кортежи, вычисляемые типы (
keyof, mapped, условные, шаблонные строки). - Только `interface`: слияние объявлений — два интерфейса с одним именем объединяются; так расширяют типы библиотек и глобальные объекты.
- Ошибки: конфликт полей при
interface extends— сразу ошибка, приtype &— молчаливыйneverв поле. - Производительность компиляции — на огромных типах интерфейсы кешируются лучше.
Практика
В команде договариваются о правиле, например: interface для объектов и публичного API, type — для всего остального.
Коротко для собеседования
Для объектов они почти дублируют друг друга, но type нужен для объединений и вычисляемых типов, а interface — для слияния объявлений и расширения чужих типов.