J'essaie d'ajouter une propriété pour exprimer un objet de requête à partir d'un middleware en utilisant du typographie. Cependant, je ne peux pas comprendre comment ajouter des propriétés supplémentaires à l'objet. Je préférerais ne pas utiliser la notation entre crochets si possible.
Je recherche une solution qui me permettrait d'écrire quelque chose de similaire (si possible):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
node.js
express
typescript
Isak Ågren
la source
la source
Réponses:
Vous souhaitez créer une définition personnalisée et utiliser une fonctionnalité dans Typescript appelée Fusion de déclaration . Ceci est couramment utilisé, par exemple dans
method-override
.Créez un fichier
custom.d.ts
et assurez-vous de l'inclure dans votre sectiontsconfig.json
s, lefiles
cas échéant. Le contenu peut se présenter comme suit:Cela vous permettra, à tout moment de votre code, d'utiliser quelque chose comme ceci:
la source
files
section restreint l'ensemble des fichiers inclus par TypeScript. Si vous ne spécifiez pasfiles
ouinclude
, alors tous*.d.ts
sont inclus par défaut, il n'est donc pas nécessaire d'y ajouter vos typages personnalisés.Property 'tenant
n'existe pas sur le type 'Demande' `` Cela ne fait aucune différence si je l'inclus explicitementtsconfig.json
ou non. MISE À JOUR Avecdeclare global
comme @basarat le souligne dans ses œuvres d'answear, mais je devais d'import {Request} from 'express'
abord le faire .Request
objet dans expressjs (4.x au moins)Comme suggéré par les commentaires dans le
index.d.ts
, vous déclarez simplement à l'Express
espace de noms global tous les nouveaux membres. Exemple:Exemple complet:
L'extension des espaces de noms globaux est plus abordée dans mon GitBook .
la source
Pour les versions plus récentes d'Express, vous devez augmenter le
express-serve-static-core
module.Ceci est nécessaire car maintenant l'objet Express vient de là: https://github.com/DefinitelyTyped/DefinatelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
En gros, utilisez ce qui suit:
la source
'express'
module n'a pas fonctionné. Je vous remercie!import {Express} from "express-serve-static-core";
export {}
qui fonctionne également.express.d.ts
, sinon le compilateur essaiera de le fusionner avec les typages express, ce qui entraînera des erreurs.La réponse acceptée (comme les autres) ne fonctionne pas pour moi mais
fait. J'espère que cela aidera quelqu'un.
la source
*.d.ts
fichiers et simplement stocker vos types dans des*.ts
fichiers normaux .custom-declarations.d.ts
fichier à la racine du projet TypeScript.import { Request as IRequest } from 'express/index';
etinterface Request extends IRequest
. Il fallait également ajouter le type RacineAprès avoir essayé environ 8 réponses et sans succès. J'ai finalement réussi à le faire fonctionner avec jd291 commentaire de pointage à 3mards repo .
Créez un fichier dans la base appelé
types/express/index.d.ts
. Et écrivez-y:et incluez-le
tsconfig.json
avec:Ensuite,
yourProperty
devrait être accessible sous chaque demande:la source
Aucune des solutions proposées n'a fonctionné pour moi. J'ai fini par étendre simplement l'interface de requête:
Alors pour l'utiliser:
Edit : Les versions récentes de TypeScript se plaignent de cela. Au lieu de cela, j'ai dû faire:
la source
Dans TypeScript, les interfaces sont ouvertes. Cela signifie que vous pouvez leur ajouter des propriétés de n'importe où en les redéfinissant simplement.
Étant donné que vous utilisez ce fichier express.d.ts , vous devriez pouvoir redéfinir l' interface de demande pour ajouter le champ supplémentaire.
Ensuite, dans votre fonction middleware, le paramètre req doit également avoir cette propriété. Vous devriez pouvoir l'utiliser sans aucune modification de votre code.
la source
Request.user = {};
dans laapp.ts
façon dont neuserController.ts
sait à ce sujet?express.Handler
(au lieu de spécifier manuellement(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), il ne semble pas faire référence au mêmeRequest
car il se plaint que ma propriété n'existe pas.declare module "express"
mais pas si j'utilisedeclare namespace Express
. Je préfère utiliser la syntaxe de l'espace de noms, mais cela ne fonctionne tout simplement pas pour moi.Bien qu'il s'agisse d'une question très ancienne, je suis tombé sur ce problème récemment.La réponse acceptée fonctionne bien mais je devais ajouter une interface personnalisée à
Request
- une interface que j'avais utilisée dans mon code et qui ne fonctionnait pas si bien avec l'accepté répondre. Logiquement, j'ai essayé ceci:Mais cela n'a pas fonctionné car Typescript traite les
.d.ts
fichiers comme des importations globales et lorsqu'ils contiennent des importations, ils sont traités comme des modules normaux. C'est pourquoi le code ci-dessus ne fonctionne pas sur un paramètre dactylographié standard.Voici ce que j'ai fini par faire
la source
.d.ts
,tsconfig.json
et l'instance d'utilisation? De plus, quelle version de typographie utilisez-vous car cette importation dans les modules globaux n'est prise en charge qu'à partir de TS 2.9? Cela pourrait mieux aider.... "include": [ "src/**/*" ] ...
fonctionne pour moi mais"include": ["./src/", "./src/Types/*.d.ts"],
ne le fait pas. Je ne suis pas encore allé en profondeur pour essayer de comprendre celaPeut-être que ce problème a été résolu, mais je veux partager juste un peu, maintenant parfois une interface comme d'autres réponses peut être un peu trop restrictive, mais nous pouvons en fait maintenir les propriétés requises, puis ajouter des propriétés supplémentaires à ajouter en créant un clé avec un type de
string
avec type valeur deany
Alors maintenant, nous pouvons également ajouter toute propriété supplémentaire que nous voulons à cet objet.
la source
Toutes ces réponses semblent erronées ou dépassées d'une manière ou d'une autre.
Cela a fonctionné pour moi en mai 2020:
dans
${PROJECT_ROOT}/@types/express/index.d.ts
:dans
tsconfig.json
, ajoutez / fusionnez la propriété de telle sorte que:À votre santé.
la source
Si vous recherchez une solution qui fonctionne avec express4, la voici:
@ types / express / index.d.ts: -------- doit être /index.d.ts
tsconfig.json:
Réf de https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
la source
Une solution possible consiste à utiliser la "double coulée vers tout"
1- définir une interface avec votre propriété
2- double fonte
Les avantages de la double coulée sont les suivants:
-noImplicitany
drapeauAlternativement, il y a l'itinéraire rapide (non typé):
(ne modifiez pas les fichiers de définition existants avec vos propres propriétés - cela ne peut pas être maintenu. Si les définitions sont incorrectes, ouvrez une demande d'extraction)
ÉDITER
Voir le commentaire ci-dessous, le casting simple fonctionne dans ce cas
req as MyRequest
la source
MyRequest
étend lehttp.IncomingMessage
. Ce n'était pas le cas, le double casting viaany
serait la seule alternativeCette réponse sera bénéfique pour ceux qui comptent sur le package npm
ts-node
.Je luttais également avec le même souci d'étendre l' objet de requête , j'ai suivi beaucoup de réponses dans le stack-overflow et j'ai fini par suivre la stratégie mentionnée ci-dessous.
J'ai déclaré la saisie étendue pour express dans le répertoire suivant.
${PROJECT_ROOT}/api/@types/express/index.d.ts
puis mettre
tsconfig.json
à jour mon à quelque chose comme ça.même après avoir effectué les étapes ci-dessus, le studio visuel a cessé de se plaindre, mais malheureusement, le
ts-node
compilateur avait encore l'habitude de lancer.Apparemment, le
ts-node
n'a pas pu localiser les définitions de type étendues pour l' objet de requête .Finalement, après avoir passé des heures, car je savais que le code VS ne se plaignait pas et était capable de localiser les définitions de frappe, ce qui implique que quelque chose ne va pas avec le
ts-node
complier.Mise à jour de départ
script
enpackage.json
fixe pour moi.les
--files
arguments jouent ici un rôle clé pour déterminer les définitions de type personnalisées.Pour plus d'informations, veuillez visiter: https://github.com/TypeStrong/ts-node#help-my-types-are-missing
la source
Aider tous ceux qui recherchent simplement quelque chose d'autre à essayer, voici ce qui a fonctionné pour moi fin mai 2020 en essayant d'étendre la demande d'ExpressJS. J'ai dû essayer plus d'une douzaine de choses avant que cela fonctionne:
la source
Il est peut-être déjà assez tard pour cette réponse, mais de toute façon, voici comment j'ai résolu:
tsconfig
fichier (cela pourrait être un tout nouveau fil)express
express
répertoire, créez un fichier et nommez-leindex.d.ts
(DOIT ÊTRE EXACTEMENT COMME CELA)la source
pourquoi avons-nous besoin de faire autant de tracas que dans les réponses acceptées ci-dessus, alors que nous pouvons nous en tirer juste cela
au lieu de joindre notre propriété à la demande , nous pouvons la joindre aux en- têtes de la demande
la source