Выбор ответа Middle tsconfig и декларации обновлено
Добавить поле в Request
Вопрос
Мидлвара кладёт req.userId. Как добавить это поле в тип Request из Express для всего проекта?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: declare module 'express-serve-static-core' { interface Request { userId?: string } }. Расширение модуля (module augmentation) дописывает поля в интерфейс чужой библиотеки за счёт слияния интерфейсов, и новое поле видно везде, где используется Request.
Варианты ответа
- Написать
type Request = express.Request & { userId?: string }в каждом файле - Выключить проверку там, где нужно:
(req as any).userIdв каждом обработчике - Объявить
class Request extends express.Request { userId?: string }и экспортировать declare module 'express-serve-static-core' { interface Request { userId?: string } }правильный ответ
Разбор
Расширение модуля (module augmentation) дописывает поля в интерфейс чужой библиотеки за счёт слияния интерфейсов, и новое поле видно везде, где используется Request. В типах Express интерфейс Request объявлен в пакете express-serve-static-core, поэтому расширяют именно его. Файл с расширением должен быть модулем.
Свой класс не повлияет на тип req, который Express передаёт в обработчик. Пересечение в каждом файле дублирует код. as any выключает проверки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.