如何在Typescript中键入异步表达中间件函数?

时间:2018-05-13 16:41:00

标签: typescript express async-await middleware

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

我还试图重载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'.
*/

1 个答案:

答案 0 :(得分:2)

RequestIUserRequest类型不兼容,因为user中缺少Request。在分配给req之前,该属性可能不会出现在export interface IUserRequest extends Request { user?: IUserData } 中。

应该是:

var obj1 = {
  test: 0
};
var obj2 = Object.assign({}, obj1);
obj2.test = 2;
console.log(obj1, obj2);