В чем разница между интерфейсом и типом

Ответ

Основное отличие в возможностях и использовании:

  1. Расширение:

    • Интерфейсы можно расширять через extends
    interface A { x: number }
    interface B extends A { y: string }
*   Типы через `&` (intersection)
    type A = { x: number }
    type B = A & { y: string }
  1. Объединение:

    • Интерфейсы поддерживают объявление слияния (declaration merging)
    interface User { name: string }
    interface User { age: number }
    // User теперь имеет оба поля
*   Типы так делать нельзя
  1. Использование:

    • Интерфейсы лучше для объектов/классов
    • Типы для сложных комбинаций, юнион-типов
    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, объектная модель — интерфейсы. Всё остальное, особенно всякие хитрожопые комбинации — типы. И не выёбывайся.