Ich versuche, eine Eigenschaft hinzuzufügen, um das Anforderungsobjekt einer Middleware mithilfe von Typoskript auszudrücken. Ich kann jedoch nicht herausfinden, wie dem Objekt zusätzliche Eigenschaften hinzugefügt werden können. Ich würde es vorziehen, wenn möglich keine Klammernotation zu verwenden.
Ich suche nach einer Lösung, mit der ich (wenn möglich) etwas Ähnliches schreiben kann:
app.use((req, res, next) => {
req.property = setProperty();
next();
});
node.js
express
typescript
Isak Ågren
quelle
quelle
Antworten:
Sie möchten eine benutzerdefinierte Definition erstellen und in Typescript eine Funktion namens Declaration Merging verwenden . Dies wird üblicherweise verwendet, z
method-override
.Erstellen Sie eine Datei
custom.d.ts
und stellen Sie sicher , es schließen in Ihremtsconfig.json
‚sfiles
-Abschnitt falls vorhanden. Der Inhalt kann wie folgt aussehen:Auf diese Weise können Sie zu jedem Zeitpunkt in Ihrem Code Folgendes verwenden:
quelle
files
Abschnitt schränkt den Satz von Dateien ein, die in TypeScript enthalten sind. Wenn Sie nicht angeben ,files
oderinclude
, dann werden alle*.d.ts
standardmäßig enthalten sind, so gibt es keine Notwendigkeit , Ihre individuellen Typisierungen hinzuzufügen gibt.Property 'tenant
nicht existiert für Typ 'Anfrage' `Macht keinen Unterschied, ob ich es explizit in einbindetsconfig.json
oder nicht. UPDATE Mitdeclare global
wie @basarat in seinen Answear-Arbeiten hervorhebt, musste ich dasimport {Request} from 'express'
erstmal machen.Request
Objekt in Expressjs (mindestens 4.x) zu erweiternWie aus den Kommentaren in der hervorgeht
index.d.ts
, deklarieren Sie einfachExpress
alle neuen Mitglieder im globalen Namespace. Beispiel:Vollständiges Beispiel:
Das Erweitern globaler Namespaces wird in meinem GitBook ausführlicher behandelt .
quelle
Für neuere Express-Versionen müssen Sie das
express-serve-static-core
Modul erweitern.Dies ist erforderlich, da das Express-Objekt jetzt von dort stammt: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Verwenden Sie grundsätzlich Folgendes:
quelle
'express'
Moduls dies nicht tat. Danke dir!import {Express} from "express-serve-static-core";
export {}
die auch funktioniert.express.d.ts
wird. Andernfalls versucht der Compiler, diese Datei mit den Express-Typisierungen zusammenzuführen, was zu Fehlern führt.Die akzeptierte Antwort (wie die anderen) funktioniert bei mir aber nicht
tat. Hoffe das wird jemandem helfen.
quelle
*.d.ts
Dateien verwenden und Ihre Typen nur in regulären*.ts
Dateien speichern möchten .custom-declarations.d.ts
Datei in das Projektstammverzeichnis von TypeScript.import { Request as IRequest } from 'express/index';
undinterface Request extends IRequest
. Musste auch den typeRootNach 8 oder so Antworten und ohne Erfolg. Ich habe es endlich geschafft, es mit jd291s Kommentar zum 3mards Repo zum Laufen zu bringen .
Erstellen Sie eine Datei in der Basis mit dem Namen
types/express/index.d.ts
. Und darin schreiben:und fügen Sie es hinzu
tsconfig.json
mit:Dann
yourProperty
sollte unter jeder Anfrage zugänglich sein:quelle
Keine der angebotenen Lösungen hat bei mir funktioniert. Am Ende habe ich einfach die Anforderungsschnittstelle erweitert:
Dann, um es zu benutzen:
Bearbeiten : Neuere Versionen von TypeScript beschweren sich darüber. Stattdessen musste ich tun:
quelle
In TypeScript sind Schnittstellen offen. Das heißt, Sie können ihnen von überall Eigenschaften hinzufügen, indem Sie sie einfach neu definieren.
Wenn Sie diese express.d.ts- Datei verwenden, sollten Sie die Anforderungsschnittstelle neu definieren können, um das zusätzliche Feld hinzuzufügen.
In Ihrer Middleware-Funktion sollte der Parameter req ebenfalls diese Eigenschaft haben. Sie sollten es ohne Änderungen an Ihrem Code verwenden können.
quelle
Request.user = {};
inapp.ts
wie funktioniertuserController.ts
es wissen?express.Handler
(anstatt ihn manuell anzugeben(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), scheint er sich nicht auf denselben zu beziehen,Request
da er sich beschwert, dass meine Eigenschaft nicht existiert.declare module "express"
aber nicht, wenn ich es benutzedeclare namespace Express
. Ich würde lieber die Namespace-Syntax verwenden, aber sie funktioniert bei mir einfach nicht.Obwohl dies eine sehr alte Frage ist, bin ich in letzter Zeit auf dieses Problem gestoßen. Die akzeptierte Antwort funktioniert in Ordnung, aber ich musste eine benutzerdefinierte Schnittstelle hinzufügen
Request
- eine Schnittstelle, die ich in meinem Code verwendet hatte und die mit der akzeptierten nicht so gut funktionierte Antworten. Logischerweise habe ich Folgendes versucht:Dies hat jedoch nicht funktioniert, da Typescript
.d.ts
Dateien als globale Importe behandelt und wenn sie Importe enthalten, werden sie als normale Module behandelt. Aus diesem Grund funktioniert der obige Code bei einer Standardeinstellung für Typoskripte nicht.Folgendes habe ich getan
quelle
.d.ts
,tsconfig.json
und die Verwendung Beispiel? Welche Version von Typoskript verwenden Sie, da dieser Import in globale Module nur ab TS 2.9 unterstützt wird? Das könnte besser helfen.... "include": [ "src/**/*" ] ...
funktioniert es für mich,"include": ["./src/", "./src/Types/*.d.ts"],
aber nicht. Ich habe noch nicht versucht, dies zu verstehenVielleicht wurde dieses Problem beantwortet, aber ich möchte nur ein wenig teilen. Jetzt kann eine Schnittstelle wie andere Antworten manchmal etwas zu restriktiv sein, aber wir können die erforderlichen Eigenschaften tatsächlich beibehalten und dann alle zusätzlichen Eigenschaften hinzufügen, die durch Erstellen eines hinzugefügt werden sollen Schlüssel mit einem Typ von
string
mit Wert Typ vonany
Jetzt können wir diesem Objekt auch jede weitere Eigenschaft hinzufügen, die wir möchten.
quelle
Wenn Sie nach einer Lösung suchen, die mit express4 funktioniert, finden Sie hier:
@ types / express / index.d.ts: -------- muss /index.d.ts sein
tsconfig.json:
Siehe https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
quelle
Alle diese Antworten scheinen auf die eine oder andere Weise falsch oder veraltet zu sein.
Das hat bei mir im Mai 2020 funktioniert:
in
${PROJECT_ROOT}/@types/express/index.d.ts
:in
tsconfig.json
, Add / fusionieren die Eigenschaft, dass:Prost.
quelle
Eine mögliche Lösung ist die Verwendung von "Double Casting to any".
1- Definieren Sie eine Schnittstelle zu Ihrer Immobilie
2- Doppelbesetzung
Die Vorteile des Doppelgusses sind:
-noImplicitany
Flagge zusammengestelltAlternativ gibt es die schnelle (untypisierte) Route:
(Bearbeiten Sie vorhandene Definitionsdateien nicht mit Ihren eigenen Eigenschaften - dies ist nicht wartbar. Wenn die Definitionen falsch sind, öffnen Sie eine Pull-Anforderung.)
BEARBEITEN
Siehe Kommentar unten, einfaches Casting funktioniert in diesem Fall
req as MyRequest
quelle
MyRequest
erweitert diehttp.IncomingMessage
. Wäre dies nicht der Fall, wäre Double Casting viaany
die einzige AlternativeDiese Antwort ist für diejenigen von Vorteil, die sich auf das npm-Paket verlassen
ts-node
.Ich hatte auch mit dem gleichen Problem zu kämpfen, das Anforderungsobjekt zu erweitern . Ich folgte vielen Antworten im Stapelüberlauf und folgte schließlich der unten genannten Strategie.
Ich habe die erweiterte Eingabe für Express im folgenden Verzeichnis deklariert .
${PROJECT_ROOT}/api/@types/express/index.d.ts
dann aktualisiere ich
tsconfig.json
auf so etwas.Selbst nachdem die obigen Schritte ausgeführt wurden, hörte das Visual Studio auf, sich zu beschweren, aber leider
ts-node
warf der Compiler immer noch.Anscheinend
ts-node
konnte der die erweiterten Typdefinitionen für die Anfrage nicht finden .Nachdem ich Stunden verbracht hatte, beschwerte ich mich, dass der VS-Code sich nicht beschwerte und die Typisierungsdefinitionen finden konnte, was bedeutet, dass etwas mit der
ts-node
Konformität nicht stimmt.Aktualisierungsstart
script
inpackage.json
behoben für mich.Die
--files
Argumente spielen hier eine Schlüsselrolle bei der Bestimmung der benutzerdefinierten Typdefinitionen.Weitere Informationen finden Sie unter: https://github.com/TypeStrong/ts-node#help-my-types-are-missing
quelle
Allen zu helfen, die nur nach etwas anderem suchen, um es hier zu versuchen, hat mir Ende Mai 2020 geholfen, als ich versuchte, die Anfrage von ExpressJS zu verlängern. Ich musste mehr als ein Dutzend Dinge ausprobiert haben, bevor dies funktioniert:
quelle
Es mag für diese Antwort schon ziemlich spät sein, aber trotzdem habe ich Folgendes gelöst:
tsconfig
Datei enthalten ist (dies könnte ein ganz neuer Thread sein).express
express
Erstellen Sie innerhalb des Verzeichnisses eine Datei und benennen Sie sieindex.d.ts
(MUSS GENAU WIE DAS SEIN)quelle