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.ts
y asegúrese de incluirlo en su seccióntsconfig.json
's,files
si la hubiera. El contenido puede tener el siguiente aspecto:Esto le permitirá, en cualquier punto de su código, usar algo como esto:
fuente
files
sección restringe el conjunto de archivos incluidos por TypeScript. Si no especificafiles
oinclude
, entonces todos*.d.ts
se incluyen de forma predeterminada, por lo que no es necesario agregar sus mecanografiados personalizados allí.Property 'tenant
no existe en el tipo 'Solicitud'. No importa si lo incluyo explícitamentetsconfig.json
o no. ACTUALIZAR Condeclare global
@basarat pointet en sus trabajos de answear, pero tenía que hacerloimport {Request} from 'express'
primero.Request
objeto en expressjs (4.x al menos)Como lo sugieren los comentarios en el
index.d.ts
, simplemente declare en elExpress
espacio 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-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, 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.ts
archivos y simplemente almacenar sus tipos dentro de*.ts
archivos normales .custom-declarations.d.ts
archivo 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.json
con:Entonces
yourProperty
deberí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.ts
conozco?express.Handler
(en lugar de especificar manualmente(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), no parece referirse a lo mismo,Request
ya 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.ts
archivos 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.json
y 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
string
con el tipo de valor deany
Entonces, 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:
-noImplicitany
banderaAlternativamente, 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 MyRequest
fuente
MyRequest
extiende elhttp.IncomingMessage
. Si no fuera el caso, el doble casting víaany
serí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.ts
luego actualizo mi
tsconfig.json
a algo como esto.incluso después de realizar los pasos anteriores, Visual Studio dejó de quejarse, pero desafortunadamente, el
ts-node
compilador todavía solía lanzar.Aparentemente,
ts-node
no 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-node
cumplidor.Actualización de inicio
script
enpackage.json
fijo por mí.los
--files
argumentos 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í:
tsconfig
archivo (esto podría ser un hilo completamente nuevo)express
express
directorio, 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