Saya mencoba menambahkan properti untuk mengekspresikan objek permintaan dari middleware menggunakan skrip ketikan. Namun saya tidak tahu bagaimana menambahkan properti tambahan ke objek. Saya lebih suka tidak menggunakan notasi braket jika memungkinkan.
Saya mencari solusi yang memungkinkan saya menulis sesuatu yang mirip dengan ini (jika memungkinkan):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
node.js
express
typescript
Isak Ågren
sumber
sumber
Jawaban:
Anda ingin membuat definisi kustom, dan menggunakan fitur di Typecript yang disebut Penggabungan Deklarasi . Ini biasanya digunakan, misalnya dalam
method-override
.Buat file
custom.d.ts
dan pastikan untuk memasukkannya ke dalam Andatsconfig.json
'sfiles
-bagian jika ada. Isinya bisa terlihat sebagai berikut:Ini akan memungkinkan Anda, kapan pun dalam kode Anda, menggunakan sesuatu seperti ini:
sumber
files
Bagian membatasi set file disertakan oleh naskah. Jika Anda tidak menentukanfiles
atauinclude
, maka semua*.d.ts
disertakan secara default, jadi tidak perlu menambahkan pengetikan kustom Anda di sana.Property 'tenant
tidak ada pada jenis 'Permintaan' `` Tidak ada bedanya jika saya secara eksplisit memasukkannyatsconfig.json
atau tidak. UPDATE Dengandeclare global
seperti yang ditunjukkan @basarat di jawaban dia, tetapi saya harus melakukannyaimport {Request} from 'express'
terlebih dahulu.Request
objek dalam expressjs (setidaknya 4.x)Seperti yang disarankan oleh komentar di
index.d.ts
, Anda cukup mendeklarasikan keExpress
namespace global setiap anggota baru. Contoh:Contoh Lengkap:
Memperluas namespace global dibahas lebih lanjut di GitBook saya .
sumber
Untuk versi express yang lebih baru, Anda perlu menambah
express-serve-static-core
modul.Ini diperlukan karena sekarang objek Express berasal dari sana: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Pada dasarnya, gunakan yang berikut ini:
sumber
'express'
modul lama tidak. Terima kasih!import {Express} from "express-serve-static-core";
export {}
yang juga berfungsi.express.d.ts
, jika tidak kompilator akan mencoba menggabungkan ini ke dalam pengetikan ekspres, mengakibatkan kesalahan.Jawaban yang diterima (seperti yang lain) tidak berhasil untuk saya tetapi
melakukan. Harapan itu akan membantu seseorang.
sumber
*.d.ts
file dan hanya menyimpan tipe Anda dalam*.ts
file biasa .custom-declarations.d.ts
file saya di root proyek TypeScript.import { Request as IRequest } from 'express/index';
daninterface Request extends IRequest
. Juga harus menambahkan typeRootSetelah mencoba 8 atau lebih jawaban dan tidak berhasil. Saya akhirnya berhasil membuatnya bekerja dengan jd291 's komentar menunjuk ke 3mards repo .
Buat file di basis bernama
types/express/index.d.ts
. Dan di dalamnya tertulis:dan memasukkannya ke dalam
tsconfig.json
:Kemudian
yourProperty
harus dapat diakses di bawah setiap permintaan:sumber
Tidak ada solusi yang ditawarkan yang berhasil untuk saya. Saya akhirnya hanya memperluas antarmuka Permintaan:
Kemudian untuk menggunakannya:
Sunting : Versi terbaru dari TypeScript mengeluh tentang ini. Sebaliknya, saya harus melakukan:
sumber
Di TypeScript, antarmuka terbuka. Itu berarti Anda dapat menambahkan properti ke dalamnya dari mana saja hanya dengan mendefinisikannya kembali.
Mempertimbangkan bahwa Anda menggunakan file express.d.ts ini , Anda harus dapat mendefinisikan ulang antarmuka Request untuk menambahkan field ekstra.
Kemudian di fungsi middleware Anda, parameter req harus memiliki properti ini juga. Anda harus dapat menggunakannya tanpa ada perubahan pada kode Anda.
sumber
Request.user = {};
diapp.ts
how doesuserController.ts
know about it?express.Handler
(alih-alih menentukan secara manual(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), tampaknya tidak mengacu pada hal yang samaRequest
karena mengeluh bahwa properti saya tidak ada.declare module "express"
tetapi tidak jika saya menggunakandeclare namespace Express
. Saya lebih suka menggunakan sintaks namespace tetapi itu tidak berhasil untuk saya.Meskipun ini adalah pertanyaan yang sangat lama, saya menemukan masalah ini belakangan ini. Jawaban yang diterima berfungsi dengan baik tetapi saya perlu menambahkan antarmuka khusus ke
Request
- antarmuka yang telah saya gunakan dalam kode saya dan tidak berfungsi dengan baik dengan yang diterima menjawab. Logikanya, saya mencoba ini:Tapi itu tidak berhasil karena Typecript memperlakukan
.d.ts
file sebagai impor global dan ketika ada impor di dalamnya, file tersebut diperlakukan sebagai modul normal. Itulah mengapa kode di atas tidak berfungsi pada pengaturan skrip jenis standar.Inilah yang akhirnya saya lakukan
sumber
.d.ts
,tsconfig.json
dan contoh penggunaan? Plus, versi skrip apa yang Anda gunakan karena pengimporan dalam modul global ini hanya didukung mulai dari TS 2.9? Itu bisa membantu lebih baik.... "include": [ "src/**/*" ] ...
Berfungsi untuk saya tetapi"include": ["./src/", "./src/Types/*.d.ts"],
tidak. Saya belum mencoba memahami hal ini secara mendalamMungkin masalah ini telah terjawab, tetapi saya ingin berbagi sedikit, sekarang terkadang antarmuka seperti jawaban lain bisa menjadi sedikit terlalu membatasi, tetapi kami sebenarnya dapat mempertahankan properti yang diperlukan dan kemudian menambahkan properti tambahan untuk ditambahkan dengan membuat kunci dengan tipe
string
dengan tipe nilaiany
Jadi sekarang, kita juga bisa menambahkan properti tambahan yang kita inginkan ke objek ini.
sumber
Semua tanggapan ini tampaknya salah atau ketinggalan jaman dalam beberapa hal.
Ini berhasil untuk saya pada Mei 2020:
di
${PROJECT_ROOT}/@types/express/index.d.ts
:di
tsconfig.json
, tambahkan / gabungkan properti seperti itu:Bersulang.
sumber
Jika Anda mencari solusi yang berfungsi dengan express4, ini dia:
@ types / express / index.d.ts: -------- harus /index.d.ts
tsconfig.json:
Referensi dari https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
sumber
Salah satu solusi yang mungkin adalah menggunakan "pengecoran ganda ke salah satu"
1- Tentukan antarmuka dengan properti Anda
2- pemeran ganda
Keuntungan dari pengecoran ganda adalah:
-noImplicitany
benderaAlternatifnya, ada rute cepat (tanpa tipe):
(jangan mengedit file definisi yang ada dengan properti Anda sendiri - ini tidak dapat dipertahankan. Jika definisi salah, buka pull request)
EDIT
Lihat komentar di bawah, casting sederhana bekerja dalam kasus ini
req as MyRequest
sumber
MyRequest
memperluashttp.IncomingMessage
. Bukan itu masalahnya, casting ganda melaluiany
akan menjadi satu-satunya alternatifJawaban ini akan bermanfaat bagi mereka yang mengandalkan paket npm
ts-node
.Saya juga bergumul dengan perhatian yang sama dalam menyampaikan permintaan objek , saya mengikuti banyak jawaban di stack-overflow & diakhiri dengan mengikuti strategi yang disebutkan di bawah ini.
Saya menyatakan pengetikan diperpanjang untuk express di direktori berikut.
${PROJECT_ROOT}/api/@types/express/index.d.ts
kemudian memperbarui saya
tsconfig.json
ke sesuatu seperti ini.bahkan setelah melakukan langkah-langkah di atas, studio visual berhenti mengeluh, tetapi sayangnya,
ts-node
compiler masih digunakan untuk membuang.Rupanya,
ts-node
tidak dapat menemukan definisi tipe yang diperluas untuk permintaan objek .Akhirnya setelah menghabiskan berjam-jam, karena saya tahu VS Code tidak mengeluh & dapat menemukan definisi pengetikan, menyiratkan ada yang salah dengan
ts-node
complier.Memperbarui mulai
script
dalampackage.json
memperbaikinya untuk saya.yang
--files
argumen memainkan peran kunci di sini menemukan menentukan definisi jenis kustom.Untuk informasi lebih lanjut, kunjungi: https://github.com/TypeStrong/ts-node#help-my-types-are-missing
sumber
Untuk membantu siapa saja yang hanya mencari sesuatu yang lain untuk dicoba di sini, itulah yang berhasil bagi saya pada akhir Mei 2020 ketika mencoba untuk memperpanjang Permintaan ExpressJS. Saya harus mencoba lebih dari selusin hal sebelum ini bekerja:
sumber
Mungkin sudah cukup terlambat untuk jawaban ini, tapi begini cara saya menyelesaikannya:
tsconfig
file Anda (ini bisa menjadi utas yang sama sekali baru)express
express
direktori buat file dan beri namaindex.d.ts
(HARUS PERSIS SEPERTI ITU)sumber
mengapa kita perlu melakukan begitu banyak kerumitan seperti dalam jawaban yang diterima di atas, ketika kita bisa lolos dengan melakukan ini saja
alih-alih melampirkan properti kami ke permintaan , kami dapat melampirkannya ke header permintaan
sumber