Typescript Express'ten Request tipini genişletir
Express ve Typescript ile bir NodeJs uygulamam var. Express'ten Request türünü genişletmeye çalışıyorum.
Aşağıdaki kodla index.d.ts dosyasını oluşturdum
import { User } from "models/user";
declare global {
namespace Express {
export interface Request {
currentUser: User
}
}
}
Kod editörüm (VSCode kullanıyorum) bana her şeyin yolunda olduğunu ve otomatik tamamlama özelliğinin harika çalıştığını söylüyor. Ama çalıştırma sırasında TypeScript hata veriyor.
src/api/controllers/post.controller.ts:60:24 - error TS2339: Property 'currentUser' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.
Sorunumu çözen aşağıdaki kodu buldum
import { User } from 'models/user';
declare module "express-serve-static-core" {
export interface Request {
currentUser: User
}
}
Bu kodu uygulamamın herhangi bir dosyasına kopyalamam gerekiyordu ve çalıştı. Ama neden çalıştığını anlamıyorum. Biri bu durumun neden olduğunu ve ilk çözümün neden işe yaramadığını açıklayabilir mi?
Uygulamamı ts-node paketi ile çalıştırıyorum. ts-node ./src/index.ts
tsconfig.json
{
"compilerOptions": {
"target": "ES2016",
"module": "commonjs",
"strict": true,
"baseUrl": "./src",
"typeRoots": [
"./src/@types",
"./node_modules/@types",
],
"types": ["reflect-metadata"],
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": [
"node_modules"
]
}
Cevap #1
Daha yeni Express sürümleri için express-serve-static-core modülünü artırmanız gerekir.
Bu gereklidir çünkü şimdi Express nesnesi şuradan geliyor: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Temelde, aşağıdakileri kullanın:
@types/express/index.d.tsimport { Express } from "express-serve-static-core";
declare module 'express-serve-static-core' {
interface Request {
myField?: string
}
interface Response {
myField?: string
}
}
