Express + Typescript: Lägga till värden i router.param


Express 4.x API ger detta exempel på hur man använder Router.param:

router.param('user', function (req, res, next, id) {
  // try to get the user details from the User model and attach it to the request object
  User.find(id, function (err, user) {
    if (err) {
      next(err)
    } else if (user) {
      req.user = user
      next()
    } else {
      next(new Error('failed to load user'))
    }
  })
})

Vad är det bästa sättet att få detta att fungera med TypeScript? Raden req.user=user kommer att misslyckas i det givna exemplet, eftersom express.Request-objektet inte har en user-egenskap.

Och när det fungerar, hur använder du det i ett senare router.get-anrop?

Svar #1

Skapa en ny fil som heter custom.d.ts.

Du kan sedan lägga till egenskaper i Express.Request-gränssnittet på det här sättet:

declare namespace Express {
    export interface Request {
        myNewProperty?: string
    }
}

Detta kommer då att låta dig göra saker som detta:

app.param('user', function(req: Request, res: Response, next: NextFunction, id: string) {
    User.find(id, function(err, user) {
        if (err) {
            next(err);
        } else if (user) {
            req.user = user;
            next();
        } else {
            next(new Error('failed to load user'));
        }
    });
});

Du kan förhindra att egenskapen läggs till i varje begäran genom att skapa ett nytt gränssnitt som utökar Request-gränssnittet. Du kan sedan använda det nya gränssnittet i Express callback-funktionen på följande sätt:

interface RequestButCooler extends Request {
  user?: string;
}

app.param('user', function(req: RequestButCooler , res: Response, next: NextFunction, id: string) {
    // req.user is now available only here
});