Почему мне нужен общий тип Locals для Request в Express?

Вопрос или проблема

Я думал, что нашел способ создать свойства объекта Request без необходимости глобальных деклараций, но возникла проблема.

Я попытался использовать общие Locals для Request, чтобы создать свойство req.auth, но это вызвало ошибку, и теперь у меня есть вопрос о том, для чего это общее нужно. Вот пример:

import { Request, Response, NextFunction } from "express";

interface Local {
  auth: {
    token: string;
    payload: Object;
  }
}

const example = function (req: Request<{}, {}, {}, {}, Local>, res: Response, next: NextFunction) {
  req.auth
  next();
};

Ответ или решение

Для того чтобы правильно использовать req.locals в Express с TypeScript, важно понимать, как обрабатываются расширения типов. В вашем примере вы пытаетесь добавить свойство auth к объекту Request, что действительно требует использования дженериков.

Почему нужен дженерик Locals в Request?

В Express.js объект Request по умолчанию не содержит ряда специфических для вашего приложения полей. Когда вы добавляете новое свойство, такое как auth, необходимо указать TypeScript, что вы расширяете тип Request. Это достигается путем использования дженериков, которые позволяют вам указать дополнительные локальные свойства, которые могут быть использованы в процессе обработки запроса.

Как правильно использовать Locals?

В вашем примере вы правильно определили интерфейс Local, где указано, что req.auth будет содержать объект с полями token и payload. Однако есть нюансы, которые могут вызвать проблемы.

Пример исправленного кода:

import { Request, Response, NextFunction } from "express";

interface Auth {
  token: string;
  payload: Object;
}

interface CustomRequest extends Request {
  auth?: Auth; // Делаем свойство auth необязательным
}

const example = function (req: CustomRequest, res: Response, next: NextFunction) {
  if (req.auth) {
    console.log(req.auth.token); // Теперь доступно
  }
  next();
};

Примечания:

  1. Расширение интерфейса Request: Мы определили новый интерфейс CustomRequest, который наследует от Request и добавляет поле auth.

  2. Опциональное свойство: Поскольку не всегда наличие auth гарантировано (например, если аутентификация не произошла), лучше сделать это свойство опциональным с помощью ?.

  3. TypeScript: Теперь TypeScript будет знать о вашем новом свойстве auth, и любые попытки его использования не будут вызывать ошибок.

Заключение

Использование дженериков для расширения типов в Express с TypeScript – мощный инструмент, позволяющий писать типобезопасный код. Это улучшает понимание структуры данных и предотвращает потенциальные ошибки в коде. В вашем случае правильная настройка и применение дженериков позволят вам без проблем работать с дополнительными свойствами запросов.

Оцените материал
Добавить комментарий

Капча загружается...