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

Добавить поле в Request

Вопрос

Мидлвара кладёт req.userId. Как добавить это поле в тип Request из Express для всего проекта?

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

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

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

Коротко

Правильный ответ: declare module 'express-serve-static-core' { interface Request { userId?: string } }. Расширение модуля (module augmentation) дописывает поля в интерфейс чужой библиотеки за счёт слияния интерфейсов, и новое поле видно везде, где используется Request.

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

  1. Написать type Request = express.Request & { userId?: string } в каждом файле
  2. Выключить проверку там, где нужно: (req as any).userId в каждом обработчике
  3. Объявить class Request extends express.Request { userId?: string } и экспортировать
  4. 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 ошибок.

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