Custom Request and Response objects in Express with TypeScript
![Photo by Paulina Milde-Jachowska on Unsplash](/_next/image?url=%2Fimages%2Frandom-blog-covers%2Fpaulina-milde-jachowska-s3zGKYmVbYk-unsplash.jpg&w=1920&q=75)
If you use TypeScript and Express you might want to put some custom properties on the Request
and Response
objects or have a custom User
object. This is how you do it.
Add type definitions
Add a folder called "type-definitions" to your project. In that folder create a file called "express.d.ts". This is where you will put your custom types.
import { CustomUser } from "../src/models/user.js";
declare global {
namespace Express {
// extend the built in User with your own custom properties
interface User extends CustomUser {}
// Extend the request and response objects with your own custom properties
export interface Request {
parsedForm?: SomeCustomType;
}
export interface Response {
locals: {
allowedRoles?: string[];
};
}
}
}
Tell typescript about your custom types
Now add the following to your tsconfig.json
file:
{
"compilerOptions": {
"types": ["./type-defs/express-request-merging.d.ts"]
}
}
Now you can use your custom types in your code
middleware(req:Express.Request, res:Express.Response) {
// req.parsedForm is now available
// res.locals.allowedRoles is now available
// req.user is now available with custom props
}