typescript - ¿Cómo extender la interfaz Request de @types/express?
Aunque la gente ha hecho preguntas similares, ninguna de esas respuestas está resolviendo mi problema. Estoy en TypeScript 2.9.2 y estoy intentando agregar un objeto de contexto al objeto Request de Express. Quiero hacerlo en un archivo .d.ts.
Lo que actualmente tengo es esto: express.d.ts
declare namespace Express {
interface Request {
context: any;
}
}
Sin embargo, no se compilará porque `Property 'context' does not exist on type 'Request'`.
En mis otros archivos, Webstorm afirma que el tipo Request se está importando desde el archivo correcto.
Tenía la impresión de que podía aprovechar la fusión de declaraciones y no tener que importar o exportar una definición de tipo.
¿Esto es incorrecto?
Respuesta #1
Solo una pequeña modificación para que esto funcione:
declare namespace Express {
export interface Request {
context: any;
}
}
Cuando definimos una interfaz (o, de hecho, cualquier cosa, desde constantes hasta clases) dentro de un espacio de nombres, por defecto es visible solo para los miembros del mismo espacio de nombres, como se indica en el manual. Al añadir export hacemos saber a TypeScript que esta interfaz debe ser utilizada por el código externo, y se combinará correctamente con la declaración existente.
Esto no es una exportación verdadera, como lo sería desde el módulo (en el nivel superior), ya que el espacio de nombres en sí está declarado, no exportado. Así que simplemente lo importas desde el módulo como de costumbre:
import * as express from 'express';
Respuesta #2
Con la versión actual de TypeScript no necesitas crear un archivo .d.ts.
import express from "express";
export type MyRequest = express.Request & {
context?: any;
};
Luego úsalo en lugar del objeto de solicitud regular:
app.use(function (req: MyRequest, res: Response, next: NextFunction) {
req.context = {};
next();
}
