node.js - Express + TypeScript: Skapa typavledning för response.locals


Jag vill lägga till typer för min response.locals. Det används för att lägga till data till din förfrågnings-svar-cykel.

Vad jag försökte

// ./types/express/index.d.ts
declare global {
    declare namespace Express {
        interface Response {
            locals: {
                userId: number;
            };
        }
    }
}

// tsconfig.json
    "compilerOptions": {
        "typeRoots": ["./types"],
    }
myController.post("/", async (request, response) => {
     // Can't get type in my controller
    const { userId } = response.locals; // <- userId is any

Mål: Få korrekt typinferens för min response.locals-variabel

Versioner: "express": "^4.17.1", "@types/express": "^4.17.8", "typescript": "^4.5.4"

Svar #1

Genom att titta på @types/express-serve-static-core/index.d.ts kan vi se att det finns ett globalt namnrymd Express med några gränssnitt som vi kan utöka. Ett av dem är Locals :)

Lösningen:

src/types.d.ts (eller liknande, inkludera den i tsconfig, t.ex. i fältet "types")

declare global {
  namespace Express {
    interface Locals {
      anything: 'here'
    }
  }
}

Svar #2

Utan en ordentlig bakgrund i TypeScript kunde jag kompilera följande (efter lite trial and error):

import {Request, Response} from "express";
interface Locals extends Record<string, any> {
  userId: number;
}
interface MyResponse extends Response {
  locals: Locals;
}
export function middleware(request: Request, response: MyResponse) {
  const {userId} = response.locals;
  response.end(userId);
  return userId;
}

Deklarationsfilen (.d.ts) innehåller:

export declare function middleware(request: Request, response: MyResponse): number;

så number-typen härleddes korrekt.

Och det fungerar när jag använder denna middleware-funktion i express.

Relaterade artiklar