Ответ
Основное отличие в возможностях и использовании:
-
Расширение:
- Интерфейсы можно расширять через
extends
- Интерфейсы можно расширять через
interface A { x: number }
interface B extends A { y: string }
* Типы через `&` (intersection)
type A = { x: number }
type B = A & { y: string }
-
Объединение:
- Интерфейсы поддерживают объявление слияния (declaration merging)
interface User { name: string }
interface User { age: number }
// User теперь имеет оба поля
* Типы так делать нельзя
-
Использование:
- Интерфейсы лучше для объектов/классов
- Типы для сложных комбинаций, юнион-типов
type Status = 'loading' | 'success' | 'error'
Лучше использовать интерфейсы для публичного API (например, библиотек), так как их проще расширять. Типы - для внутренней логики.
Ответ 18+ 🔞
О, слушай, смотри, тут народ постоянно путается, как будто это какая-то высшая математика, блядь. А на самом деле всё просто, как три копейки, если не загоняться.
Ну вот смотри, первое, где они различаются — это расширение, ёпта.
С интерфейсами — всё чинно, благородно, по-семейному. Используешь слово extends, и всё, ты уже наследник, блядь.
interface База { x: number }
interface Наследник extends База { y: string }
// Всё, Наследник теперь и x имеет, и y. Красота.
А с типами — уже цирк с конями, intersection, эта самая «пересекуха». Знак &, и поехали.
type База = { x: number }
type Наследник = База & { y: string }
// По сути, тот же результат, но синтаксис другой, понимаешь? Хуй с горы.
А вот второе — это вообще пиздец, волнение ебать. Объединение объявлений, или declaration merging.
С интерфейсами — полный улет. Можешь объявить один и тот же интерфейс дважды, и они сольются, как два куска пластилина.
interface Пользователь { имя: string }
interface Пользователь { возраст: number }
// И всё, Пользователь теперь — хитрая жопа с двумя полями! Магия, блядь.
А попробуй так с типами сделать — получишь по ебалу от компилятора, сразу ошибку. Типы так не умеют, они не для этого.
И третье, самое важное — когда что использовать. Тут уже надо головой думать, э бошка.
- Интерфейсы — это твои работяги для объектов, классов, публичного API. Хочешь библиотеку написать, чтобы её другие расширяли? Интерфейс, однозначно. Они предсказуемые, как швейцарские часы.
- Типы — это уже для внутренней, сложной хуйни. Ну там, когда тебе нужно собрать юнион-тип из кусков, или какую-то ебучую комбинацию.
type СостояниеЗагрузки = 'loading' | 'success' | 'error'
// Вот это тип. Интерфейсом такую штуку не сделаешь, нихуя.
Короче, резюме такое, чтобы не ебать себе мозг: Публичное API, объектная модель — интерфейсы. Всё остальное, особенно всякие хитрожопые комбинации — типы. И не выёбывайся.