Extender el objeto de solicitud rápida usando Typecript
Estoy intentando agregar una propiedad para expresar el objeto de solicitud desde un middleware usando mecanografiado. Sin embargo, no puedo entender cómo agregar propiedades adicionales al objeto. Preferiría no utilizar notación entre corchetes si es posible.
Estoy buscando una solución que me permita escribir algo similar a esto (si es posible):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
Desea crear una definición personalizada y utilizar una función en Typecript llamada Declaración Merging . Esto se usa comúnmente, por ejemplo, en method-override
.
Cree un archivo custom.d.ts
y asegúrese de incluirlo en su tsconfig.json
sección files
-si corresponde. El contenido puede verse de la siguiente manera:
declare namespace Express {
export interface Request {
tenant?: string
}
}
Esto le permitirá, en cualquier punto de su código, usar algo como esto:
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)
})
Como lo sugieren los comentarios enindex.d.ts
, simplemente declara Express
cualquier miembro nuevo en el espacio de nombres global. Ejemplo:
declare global {
namespace Express {
interface Request {
context: Context
}
}
}
Ejemplo completo:
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!'))
Más
La ampliación de los espacios de nombres globales también se trata en TypeScript Deep Dive .
Para versiones más nuevas de express, es necesario aumentar el express-serve-static-core
módulo.
Esto es necesario porque ahora el objeto Express proviene de allí: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Básicamente, utilice lo siguiente:
declare module 'express-serve-static-core' {
interface Request {
myField?: string
}
interface Response {
myField?: string
}
}