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.
