Extend Express Request object using Typescript
You want to create a custom definition, and use a feature in Typescript called Declaration Merging. This is commonly used, e.g. in method-override
.
Create a file custom.d.ts
and make sure to include it in your tsconfig.json
's files
-section if any. The contents can look as follows:
declare namespace Express { export interface Request { tenant?: string }}
This will allow you to, at any point in your code, use something like this:
router.use((req, res, next) => { req.tenant = 'tenant-X' next()})router.get('/whichTenant', (req, res) => { res.status(200).send('This is your tenant: '+req.tenant)})
As suggested by the comments in the index.d.ts
, you simply declare to the global Express
namespace any new members. Example:
declare global { namespace Express { interface Request { context: Context } }}
Full Example:
import * as express from 'express';export class Context { constructor(public someContextVariable) { } log(message: string) { console.log(this.someContextVariable, { message }); }}declare global { namespace Express { interface Request { context: Context } }}const app = express();app.use((req, res, next) => { req.context = new Context(req.url); next();});app.use((req, res, next) => { req.context.log('about to return') res.send('hello world world');});app.listen(3000, () => console.log('Example app listening on port 3000!'))
Extending global namespaces is covered more at my GitBook.
For newer versions of express, you need to augment the express-serve-static-core
module.
This is needed because now the Express object comes from there: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Basically, use the following:
declare module 'express-serve-static-core' { interface Request { myField?: string } interface Response { myField?: string }}