Extender el objeto de solicitud rápida usando Typecript

Resuelto Isak Ågren asked hace 8 años • 32 respuestas

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();
});
Isak Ågren avatar May 23 '16 01:05 Isak Ågren
Aceptado

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.tsy asegúrese de incluirlo en su tsconfig.jsonsecció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)
})
maximilianvp avatar Nov 23 '2016 10:11 maximilianvp

Como lo sugieren los comentarios enindex.d.ts , simplemente declara Expresscualquier 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 .

basarat avatar Nov 23 '2017 05:11 basarat

Para versiones más nuevas de express, es necesario aumentar el express-serve-static-coremó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
  }
}
jonathancardoso avatar Apr 17 '2019 00:04 jonathancardoso