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.ts
import { Express } from "express-serve-static-core";

declare module 'express-serve-static-core' {
  interface Request {
    myField?: string
  }
  interface Response {
    myField?: string
  }
}