Выбор ответа Senior tsconfig и декларации обновлено
Расширение Request в Express
Вопрос
Как правильно добавить поле user в req Express для всего проекта?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: declare global { namespace Express { interface Request { user?: User } } }. Типы Express объявляют глобальный namespace Express с интерфейсом Request, именно для расширения через declaration merging.
Варианты ответа
- Написать
type Request = Request & { user: User }в любом файле проекта - Писать
(req as any).userво всех местах, где нужен пользователь declare global { namespace Express { interface Request { user?: User } } }правильный ответ- Унаследовать класс
Requestс полемuserи передать его вexpress()
Разбор
Типы Express объявляют глобальный namespace Express с интерфейсом Request, именно для расширения через declaration merging. Интерфейсы с одинаковым именем сливаются, а type-алиасы нет, поэтому первый вариант просто объявит новый тип. Объявление кладут в подключённый .d.ts-модуль (например с export {}). Поле делают необязательным, если middleware аутентификации стоит не на всех маршрутах. as any убивает типизацию, а наследование класса Express не поддерживает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.