A menudo fascinado por la creación de mis propias API's, quise esta vez crear mis propios "middleware". Después de investigar por dos días, encontré la solución para agregar propiedades personalizadas al objeto Request de Express en TypeScript. Aquí el resumen técnico:
Note
Este ejemplo es para que veas lo fácil que puede ser crear tu propio middleware en Typescript, lo que puede a veces resultar difícil configurar el tsconfig.json.
Al intentar agregar una propiedad personalizada al objeto Request:
index.ts
app.use(userMiddleware); // ❌ Ninguna sobrecarga coincide con esta llamada.
app.get("/", (req, res) => {
if (req.datosUsuario) {
res.send(`ID: ${req.datosUsuario.id}, Nombre: ${req.datosUsuario.nombre}`);
// ❌ La propiedad 'datosUsuario' no existe en el tipo 'Request...'
} else {
res.status(500).send("Error interno");
}
});middleware.ts
import { Request, Response, NextFunction } from "express";
export const userMiddleware = (
req: Request,
res: Response,
next: NextFunction,
): void => {
req.datosUsuario = {
id: 1,
nombre: "Juan",
};
next();
};@types/express.d.ts
import "express";
declare module "express" {
export interface Request {
datosUsuario: {
id: number;
nombre: string;
};
}
}
user@hostname MINGW64 ~/MyMiddleware
❌$ npm run build
> app@1.0.0 build
> tsc --build
src/index.ts:11:11 - error TS2339: Property 'datosUsuario' does not exist on type 'Request<{}, any, any, ParsedQs, Record>.
@types/express.d.ts
import "express";
declare global {
namespace Express {
interface Request {
datosUsuario?: {
id: number;
nombre: string;
};
}
}
}tsconfig.jon ✅ Se debe incluir los tipos
{
"compilerOptions": {
"typeRoots": [
"./node_modules/@types",
"./@types"
]
},
"include": [
"src/**/*",
"@types/**/*"
]
}Para extender Request en TypeScript:
- Crea declaraciones de tipos en @types/express.d.ts
- Configura typeRoots y include en tsconfig.json
- ¡Usa tus propiedades sin miedo a los tipos!
graph TD
A[📦 MyMiddleware] --> B(📂 @types/)
B --> C(📄 express.d.ts)
A --> D(📂 dist/)
A --> E(📂 node_modules/)
A --> F(📂 src/)
F --> G(📄 index.ts)
F --> H(📄 middleware.ts)
A --> I(📄 tsconfig.json)
A --> J(📄 package.json)
A --> K(📄 package-lock.json)
Warning
Importante: Verifica que tu directorio @types esté en la raíz del proyecto.