Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
User & { role: string } требует, чтобы объект соответствовал обеим частям одновременно: имел name из User и role из добавки. Оба поля обязательные, объект без одного из них не пройдёт.
Пара, которую стоит держать в голове:
С union доступ к полю без проверки запрещён (неизвестно, какой вариант), с пересечением доступны поля обоих типов сразу.
& даёт neverПересечение примитивов почти всегда бессмысленно:
С объектами то же самое происходит при конфликте полей:
Компилятор не ругается на само объявление, ошибка появится при попытке присвоить значение. Поэтому пересекать стоит типы, которые дополняют друг друга, а не спорят.
Для интерфейсов результат обычно совпадает, и выбор скорее стилистический. extends заявляет иерархию («администратор это пользователь») и ловит несовместимые поля прямо в объявлении. & удобнее для разовой композиции: взять готовый тип и добавить к нему пару полей, не заводя новый интерфейс.