Estoy tratando de agregar una propiedad para expresar el objeto de solicitud desde un middleware usando mecanografiado. Sin embargo, no puedo averiguar cómo agregar propiedades adicionales al objeto. Preferiría no usar la notación de 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();
});
node.js
express
typescript
Isak Ågren
fuente
fuente

Respuestas:
Desea crear una definición personalizada y utilizar una función en TypeScript llamada Fusión de declaraciones . Esto se usa comúnmente, por ejemplo, en
method-override.Cree un archivo
custom.d.tsy asegúrese de incluirlo en su seccióntsconfig.json's,filessi la hubiera. El contenido puede tener el siguiente aspecto:Esto le permitirá, en cualquier punto de su código, usar algo como esto:
fuente
filessección restringe el conjunto de archivos incluidos por TypeScript. Si no especificafilesoinclude, entonces todos*.d.tsse incluyen de forma predeterminada, por lo que no es necesario agregar sus mecanografiados personalizados allí.Property 'tenantno existe en el tipo 'Solicitud'. No importa si lo incluyo explícitamentetsconfig.jsono no. ACTUALIZAR Condeclare global@basarat pointet en sus trabajos de answear, pero tenía que hacerloimport {Request} from 'express'primero.Requestobjeto en expressjs (4.x al menos)Como lo sugieren los comentarios en el
index.d.ts, simplemente declare en elExpressespacio de nombres global cualquier miembro nuevo. Ejemplo:Ejemplo completo:
Se cubre la extensión de los espacios de nombres globales más en mi GitBook .
fuente
Para las versiones más recientes de express, necesita 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, usa lo siguiente:
fuente
'express'módulo simple no funcionó. ¡Gracias!import {Express} from "express-serve-static-core";export {}que también funciona.express.d.ts; de lo contrario, el compilador intentará fusionarlo con los tipos expresos, lo que generará errores.La respuesta aceptada (como las demás) no me funciona, pero
hizo. Espero que ayude a alguien.
fuente
*.d.tsarchivos y simplemente almacenar sus tipos dentro de*.tsarchivos normales .custom-declarations.d.tsarchivo en la raíz del proyecto de TypeScript.import { Request as IRequest } from 'express/index';yinterface Request extends IRequest. También tuve que agregar el typeRootDespués de intentar 8 o más respuestas y no tener éxito. Finalmente logré conseguir que funcione con jd291 comentario que señala 's a 3mards Repo .
Cree un archivo en la base llamado
types/express/index.d.ts. Y en él escribe:e incluirlo
tsconfig.jsoncon:Entonces
yourPropertydebería ser accesible en cada solicitud:fuente
Ninguna de las soluciones ofrecidas funcionó para mí. Terminé simplemente extendiendo la interfaz de solicitud:
Entonces para usarlo:
Editar : las versiones recientes de TypeScript se quejan de esto. En cambio, tuve que hacer:
fuente
En TypeScript, las interfaces son abiertas. Eso significa que puede agregarles propiedades desde cualquier lugar con solo redefinirlas.
Teniendo en cuenta que está utilizando este archivo express.d.ts , debería poder redefinir la interfaz de solicitud para agregar el campo adicional.
Luego, en su función de middleware, el parámetro req también debería tener esta propiedad. Debería poder usarlo sin ningún cambio en su código.
fuente
Request.user = {};enapp.ts¿cómo lauserController.tsconozco?express.Handler(en lugar de especificar manualmente(req: express.Request, res: express.Response, next: express.NextFunction) => any)), no parece referirse a lo mismo,Requestya que se queja de que mi propiedad no existe.declare module "express"pero no si lo usodeclare namespace Express. Prefiero usar la sintaxis del espacio de nombres, pero no me funciona.Si bien esta es una pregunta muy antigua, me encontré con este problema últimamente. La respuesta aceptada funciona bien, pero necesitaba agregar una interfaz personalizada
Request, una interfaz que había estado usando en mi código y que no funcionaba tan bien con la aceptada. responder. Lógicamente, probé esto:Pero eso no funcionó porque Typecript trata los
.d.tsarchivos como importaciones globales y cuando tienen importaciones se tratan como módulos normales. Es por eso que el código anterior no funciona en una configuración de mecanografiado estándar.Esto es lo que terminé haciendo
fuente
.d.ts,tsconfig.jsony la instancia de uso? Además, ¿qué versión de mecanografiado está utilizando ya que esta importación en módulos globales solo es compatible a partir de TS 2.9? Eso podría ayudar mejor.... "include": [ "src/**/*" ] ...funciona para mí pero"include": ["./src/", "./src/Types/*.d.ts"],no lo hace. Todavía no me he dedicado a tratar de entender estoTal vez este problema haya sido respondido, pero quiero compartir solo un poco, ahora a veces una interfaz como otras respuestas puede ser un poco demasiado restrictiva, pero en realidad podemos mantener las propiedades requeridas y luego agregar propiedades adicionales para agregar mediante la creación de un clave con un tipo de
stringcon el tipo de valor deanyEntonces, ahora también podemos agregar cualquier propiedad adicional que queramos a este objeto.
fuente
Si está buscando una solución que funcione con express4, aquí está:
@ types / express / index.d.ts: -------- debe ser /index.d.ts
tsconfig.json:
Ref de https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
fuente
Todas estas respuestas parecen estar equivocadas o desactualizadas de una forma u otra.
Esto funcionó para mí en mayo de 2020:
en
${PROJECT_ROOT}/@types/express/index.d.ts:en
tsconfig.json, agregue / fusione la propiedad de modo que:Salud.
fuente
Una posible solución es utilizar "fundición doble para cualquier"
1- define una interfaz con tu propiedad
2- lanzamiento doble
Las ventajas de la doble colada son las siguientes:
-noImplicitanybanderaAlternativamente, existe la ruta rápida (sin escribir):
(no edite los archivos de definición existentes con sus propias propiedades; esto no se puede mantener. Si las definiciones son incorrectas, abra una solicitud de extracción)
EDITAR
Vea el comentario a continuación, el casting simple funciona en este caso
req as MyRequestfuente
MyRequestextiende elhttp.IncomingMessage. Si no fuera el caso, el doble casting víaanysería la única alternativaEsta respuesta será beneficiosa para aquellos que confían en el paquete npm
ts-node.También estaba luchando con la misma preocupación de extender el objeto de solicitud , seguí muchas respuestas en el desbordamiento de pila y terminé siguiendo la estrategia que se menciona a continuación.
Declaré escritura extendida para expreso en el siguiente directorio.
${PROJECT_ROOT}/api/@types/express/index.d.tsluego actualizo mi
tsconfig.jsona algo como esto.incluso después de realizar los pasos anteriores, Visual Studio dejó de quejarse, pero desafortunadamente, el
ts-nodecompilador todavía solía lanzar.Aparentemente,
ts-nodeno pudo ubicar las definiciones de tipo extendido para la solicitud objeto de .Finalmente, después de pasar horas, sabía que el Código VS no se quejaba y pude ubicar las definiciones de escritura, lo que implica que algo anda mal con el
ts-nodecumplidor.Actualización de inicio
scriptenpackage.jsonfijo por mí.los
--filesargumentos juegan un papel clave aquí para determinar las definiciones de tipos personalizados.Para obtener más información, visite: https://github.com/TypeStrong/ts-node#help-my-types-are-missing
fuente
Ayudar a cualquiera que esté buscando algo más para probar aquí es lo que funcionó para mí a fines de mayo de 2020 cuando intenté extender la Solicitud de ExpressJS. Tuve que haber probado más de una docena de cosas antes de que esto funcionara:
fuente
Puede que ya sea bastante tarde para esta respuesta, pero de todos modos, así es como lo resolví:
tsconfigarchivo (esto podría ser un hilo completamente nuevo)expressexpressdirectorio, cree un archivo y asígnele un nombreindex.d.ts(DEBE SER EXACTAMENTE ASÍ)fuente
¿Por qué tenemos que hacer tantas molestias como en las respuestas aceptadas anteriores, cuando podemos hacer esto?
en lugar de adjuntar nuestra propiedad a la solicitud , podemos adjuntarla a los encabezados de la solicitud
fuente