typescript - Anpassad request- och responstyp för express-routern


Jag vill skapa en anpassad express.Request-typ som fäster en logger till förfrågan.

Jag vill inte skriva över den ursprungliga express.Request i Express utan istället skapa en ny som utökar den, eftersom vissa delar av appen har annan middleware som lägger till andra anpassade egenskaper till förfrågan.

Så i en global.d.ts definierar jag det utökade Request-gränssnittet.

import { NextFunction, Request, Response } from "express";
import { Logger } from "pino";

declare global {
  interface AppRequest extends Request {
    log: Logger;
  }
  interface AppResponse extends Response {}
  interface AppNextFunction extends NextFunction {}
}

Sedan i some-app-router.ts:

import { Router } from "express";

const router = Router();

function validateSecretMiddleWare(req: AppRequest, res: AppResponse, next: AppNextFunction):void {
  if (process.env.STATS_SECRET !== req.query.secret) {
    res.sendStatus(404);
    return;
  }

  next();
}

router.use(validateSecretMiddleWare);

export default router;

Men jag får detta fel:

Argument av typen '(req: AppRequest, res: AppResponse, next: AppNextFunction) => void' kan inte tilldelas parametern av typen 'PathParams'. Typen '(req: AppRequest, res: AppResponse, next: AppNextFunction) => void' saknar följande egenskaper från typen '(string | RegExp)[]': pop, push, concat, join, och 25 till.

Jag inspekterade express.RouterHandler och såg att det använder express.RequestHandlerParams, som använder Request, Response, NextFunction-typer, är inte min AppRequest en giltig express.Request?