Выбор ответа Senior tsconfig и декларации обновлено

Расширение Request в Express

Вопрос

Как правильно добавить поле user в req Express для всего проекта?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: declare global { namespace Express { interface Request { user?: User } } }. Типы Express объявляют глобальный namespace Express с интерфейсом Request, именно для расширения через declaration merging.

Варианты ответа

  1. Написать type Request = Request & { user: User } в любом файле проекта
  2. Писать (req as any).user во всех местах, где нужен пользователь
  3. declare global { namespace Express { interface Request { user?: User } } }правильный ответ
  4. Унаследовать класс Request с полем user и передать его в express()

Разбор

Типы Express объявляют глобальный namespace Express с интерфейсом Request, именно для расширения через declaration merging. Интерфейсы с одинаковым именем сливаются, а type-алиасы нет, поэтому первый вариант просто объявит новый тип. Объявление кладут в подключённый .d.ts-модуль (например с export {}). Поле делают необязательным, если middleware аутентификации стоит не на всех маршрутах. as any убивает типизацию, а наследование класса Express не поддерживает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме