Вопрос или проблема
Я думал, что нашел способ создать свойства объекта 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();
};
Примечания:
-
Расширение интерфейса Request: Мы определили новый интерфейс
CustomRequest
, который наследует отRequest
и добавляет полеauth
. -
Опциональное свойство: Поскольку не всегда наличие
auth
гарантировано (например, если аутентификация не произошла), лучше сделать это свойство опциональным с помощью?
. - TypeScript: Теперь TypeScript будет знать о вашем новом свойстве
auth
, и любые попытки его использования не будут вызывать ошибок.
Заключение
Использование дженериков для расширения типов в Express с TypeScript – мощный инструмент, позволяющий писать типобезопасный код. Это улучшает понимание структуры данных и предотвращает потенциальные ошибки в коде. В вашем случае правильная настройка и применение дженериков позволят вам без проблем работать с дополнительными свойствами запросов.