Express TS中间件返回类型疑问:替代'any'的合适类型是什么?
问题解答
首先明确:可以把返回类型设置为void,这也是Express中间件最标准的返回类型。
为什么移除any后会报错?
你遇到的ts(2366)错误,核心原因是函数存在两种执行分支:
- 校验失败时,你通过
return res.status(400).json(...)返回了Response类型的值 - 校验通过时,你调用
next()但没有返回值,此时函数实际返回undefined
当你移除any只保留Response作为返回类型时,TypeScript会检测到函数可能返回undefined,但你的类型定义未包含该情况,因此抛出错误。
为什么void是合适的选择?
Express中间件的设计本身不强制要求返回值:
- 你可以通过
res.send()/res.json()直接返回响应(此时return的Response对象会被框架忽略) - 也可以调用
next()让请求继续向下流转
void类型在TypeScript中表示不关心函数的返回值,无论你是return一个值还是无返回,它都能完美兼容,同时还能保留类型检查的安全性。
修改后的代码示例
直接将返回类型改为void即可解决报错:
verifyBodyFigure( req: Request, res: Response, next: NextFunction ): void { const { data } = req.body; try { figureBodySchema.parse(data); } catch (err) { if (err instanceof ZodError) { const error = new FormatError(); return res.status(400).json(error.convertError(err)); } } next(); }
另外推荐一个小优化:在调用next()时加上return,避免后续代码意外执行:
// ... return next(); // ...
内容的提问来源于stack exchange,提问作者Daniel Roberto
相关产品推荐
相关产品推荐

