你如何在 Typescript 中输入异步 express 中间件函数?

How do you type an async express middleware function in Typescript?

如何为使用 async/await 的快速中间件定义 return 值?我尝试了一些不同的东西,但运气不佳。

我也在尝试重载 Request 对象,以允许在解码 JWT 负载时定义 req.user。

import { NextFunction, Request, RequestHandler, Response } from 'express'

const authenticate: RequestHandler = async (req: IUserRequest, res: Response, next: NextFunction): Promise<void> => {
  if (! req.headers.authorization) { return next(new ValidationError()) }
  const payload: IUserData = await decodeJwt(req.headers.authorization)
  req.user = payload
  return next()
}

export interface IUserRequest extends Request {
  user: IUserData
}

/* errors 
(req: IUserRequest, res: Response, next: NextFunction) => Promise<void>' is not assignable to type 'RequestHandler'.
  Types of parameters 'req' and 'req' are incompatible.
    Type 'Request' is not assignable to type 'IUserRequest'.
      Property 'user' is missing in type 'Request'.
*/

RequestIUserRequest 类型不兼容,因为 Request 中缺少 user。 属性 在分配给它之前可能不会出现在 req 中。

应该是:

export interface IUserRequest extends Request {
  user?: IUserData
}