Próbuję dodać właściwość, aby wyrazić obiekt żądania z oprogramowania pośredniego przy użyciu skryptu. Jednak nie mogę dowiedzieć się, jak dodać dodatkowe właściwości do obiektu. Wolałbym nie używać notacji w nawiasach, jeśli to możliwe.
Szukam rozwiązania, które pozwoliłoby mi napisać coś podobnego do tego (jeśli to możliwe):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
node.js
express
typescript
Isak Ågren
źródło
źródło
Odpowiedzi:
Chcesz utworzyć niestandardową definicję i użyć funkcji w Typescript o nazwie Deklaracja scalania . Jest to powszechnie stosowane, np
method-override
. W.Utwórz plik
custom.d.ts
i upewnij się, aby umieścić go wtsconfig.json
„sfiles
-section jeśli występują. Zawartość może wyglądać następująco:Pozwoli ci to w dowolnym miejscu kodu użyć czegoś takiego:
źródło
files
Sekcja ogranicza zestaw plików zawartych przez maszynopis. Jeśli nie określiszfiles
lubinclude
, wszystkie*.d.ts
zostaną uwzględnione domyślnie, więc nie ma potrzeby dodawania tam niestandardowych typów.Property 'tenant
nie istnieje w typie `` Żądanie ''. `` Nie ma znaczenia, czy wyraźnie to uwzględnię,tsconfig.json
czy nie. AKTUALIZACJA Zdeclare global
as @basarat pointet w swojej pracy Answear, aleimport {Request} from 'express'
najpierw musiałem to zrobić .Request
obiektu w expressjs (przynajmniej 4.x)Jak sugerują komentarze w
index.d.ts
, po prostu deklarujesz w globalnejExpress
przestrzeni nazw wszystkich nowych członków. Przykład:Pełny przykład:
Rozszerzanie globalnych przestrzeni nazw jest szerzej omówione w moim GitBooku .
źródło
W przypadku nowszych wersji ekspresu musisz rozszerzyć
express-serve-static-core
moduł.Jest to potrzebne, ponieważ teraz obiekt Express pochodzi stamtąd: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Zasadniczo użyj następujących:
źródło
'express'
modułu nie. Dziękuję Ci!import {Express} from "express-serve-static-core";
export {}
które również działa.express.d.ts
, w przeciwnym razie kompilator spróbuje scalić go z typami ekspresowymi, co spowoduje błędy.Zaakceptowana odpowiedź (podobnie jak inne) nie działa dla mnie, ale
zrobił. Mam nadzieję, że to komuś pomoże.
źródło
*.d.ts
plików i po prostu przechowujesz swoje typy w zwykłych*.ts
plikach.custom-declarations.d.ts
plik w katalogu głównym projektu TypeScript.import { Request as IRequest } from 'express/index';
iinterface Request extends IRequest
. Musiałem także dodać typeRootPo wypróbowaniu 8 lub więcej odpowiedzi bez powodzenia. W końcu udało mi się to uruchomić z komentarzem jd291 wskazującym na repozytorium 3mards .
Utwórz plik w bazie o nazwie
types/express/index.d.ts
. A w nim napisz:i dołącz go
tsconfig.json
do:Następnie
yourProperty
powinien być dostępny pod każdym żądaniem:źródło
Żadne z oferowanych rozwiązań nie zadziałało. Skończyło się na rozszerzeniu interfejsu żądania:
Następnie, aby go użyć:
Edycja : najnowsze wersje języka TypeScript narzekają na to. Zamiast tego musiałem zrobić:
źródło
W języku TypeScript interfejsy są otwarte. Oznacza to, że możesz dodawać do nich właściwości z dowolnego miejsca, po prostu zmieniając ich definicję.
Biorąc pod uwagę, że używasz tego pliku express.d.ts , powinieneś być w stanie przedefiniować interfejs żądania , aby dodać dodatkowe pole.
Następnie w funkcji oprogramowania pośredniego parametr req również powinien mieć tę właściwość. Powinieneś móc go używać bez żadnych zmian w kodzie.
źródło
Request.user = {};
wapp.ts
jaki sposóbuserController.ts
o tym wiedzieć?express.Handler
(zamiast ręcznego określania(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), wydaje się, że nie odnosi się do tego samego,Request
ponieważ skarży się, że moja właściwość nie istnieje.declare module "express"
ale nie, jeśli używamdeclare namespace Express
. Wolałbym raczej używać składni przestrzeni nazw, ale to po prostu nie działa dla mnie.Chociaż jest to bardzo stare pytanie, ostatnio natknąłem się na ten problem. Zaakceptowana odpowiedź działa dobrze, ale musiałem dodać niestandardowy interfejs do
Request
- interfejsu, którego używałem w swoim kodzie i który nie działał tak dobrze z zaakceptowanym odpowiedź. Logicznie rzecz biorąc, spróbowałem tego:Ale to nie zadziałało, ponieważ Typescript traktuje
.d.ts
pliki jako import globalny, a kiedy mają w sobie import, są traktowane jak zwykłe moduły. Dlatego powyższy kod nie działa na standardowym ustawieniu maszynopisu.Oto, co ostatecznie zrobiłem
źródło
.d.ts
,tsconfig.json
a wystąpienie użyciu? Ponadto, jakiej wersji maszynopisu używasz, ponieważ importowanie w modułach globalnych jest obsługiwane tylko od wersji TS 2.9? To mogłoby pomóc lepiej.... "include": [ "src/**/*" ] ...
działa dla mnie, ale"include": ["./src/", "./src/Types/*.d.ts"],
nie. Nie wdałem się jeszcze w próbę zrozumienia tegoByć może ten problem został rozwiązany, ale chcę się trochę podzielić, teraz czasami interfejs taki jak inne odpowiedzi może być trochę zbyt restrykcyjny, ale możemy faktycznie zachować wymagane właściwości, a następnie dodać dodatkowe właściwości, które mają zostać dodane, tworząc klucz z typem
string
z typem wartościany
Więc teraz możemy również dodać dowolną dodatkową właściwość, którą chcemy, do tego obiektu.
źródło
Wszystkie te odpowiedzi wydają się być błędne lub w jakiś sposób nieaktualne.
To zadziałało dla mnie w maju 2020 roku:
w
${PROJECT_ROOT}/@types/express/index.d.ts
:in
tsconfig.json
, dodaj / połącz właściwość w taki sposób, że:Twoje zdrowie.
źródło
Jeśli szukasz rozwiązania współpracującego z express4, oto jest:
@ types / express / index.d.ts: -------- musi być /index.d.ts
tsconfig.json:
Odniesienie z https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
źródło
Jednym z możliwych rozwiązań jest użycie „podwójnego odlewania do dowolnego”
1- Zdefiniuj interfejs ze swoją nieruchomością
2- podwójny odlew
Zalety podwójnego odlewania to:
-noImplicitany
flagąAlternatywnie istnieje trasa szybka (bez typu):
(nie edytuj istniejących plików definicji z własnymi właściwościami - jest to niemożliwe do utrzymania. Jeśli definicje są nieprawidłowe, otwórz żądanie ściągnięcia)
EDYTOWAĆ
Zobacz komentarz poniżej, proste odlewanie działa w tym przypadku
req as MyRequest
źródło
MyRequest
rozszerza rozszerzeniehttp.IncomingMessage
.any
Gdyby tak nie było, jedyną alternatywą byłby podwójny casting przezTa odpowiedź będzie korzystna dla tych, którzy polegają na pakiecie npm
ts-node
.Zmagałem się również z tym samym problemem rozszerzania obiektu żądania , śledziłem wiele odpowiedzi w przepełnieniu stosu i zakończyłem zgodnie z poniższą strategią.
W następującym katalogu zadeklarowałem rozszerzone typowanie dla express .
${PROJECT_ROOT}/api/@types/express/index.d.ts
następnie zaktualizuj mój
tsconfig.json
do czegoś takiego.nawet po wykonaniu powyższych czynności studio wizualne przestało narzekać, ale niestety
ts-node
kompilator wciąż wrzucał.Najwyraźniej
ts-node
nie był w stanie zlokalizować rozszerzonych definicji typu dla obiektu żądania .W końcu po spędzeniu wielu godzin, ponieważ wiedziałem, że VS Code nie narzeka i był w stanie zlokalizować definicje pisania, sugerując, że coś jest nie tak z
ts-node
Complier.Aktualizacja Start
script
wpackage.json
naprawiła to za mnie.te
--files
argumenty odgrywają kluczową rolę tu znaleźć określenia definicji niestandardowego typu.Więcej informacji można znaleźć na stronie : https://github.com/TypeStrong/ts-node#help-my-types-are-missing
źródło
Pomaganie każdemu, kto szuka czegoś innego do wypróbowania, jest tym, co zadziałało dla mnie pod koniec maja 2020 r., Kiedy próbowałem przedłużyć żądanie ExpressJS. Musiałem wypróbować więcej niż tuzin rzeczy, zanim to zadziałało:
źródło
Na tę odpowiedź może być już dość późno, ale tak czy inaczej, oto jak rozwiązałem:
tsconfig
pliku źródło typów (może to być zupełnie nowy wątek)express
express
katalogu utwórz plik i nazwij goindex.d.ts
(MUSI BYĆ DOKŁADNIE TAK JAK)źródło
dlaczego musimy robić tyle kłopotów, jak w powyższych zaakceptowanych odpowiedziach, skoro możemy to zrobić na sucho
zamiast dołączać naszą własność do żądania , możemy dołączyć ją do nagłówków żądania
źródło