我希望充分发挥TypeScript的潜力,因此尽可能避免使用any
。
我看到过这样定义Express路由的例子:
import { Request, Response } from "express";
myRouter.route("/foo").post((req: Request, res: Response): Response => {
return res.send("Hello World");
});
那行得通,因为send()
返回一个Express Response
对象。
但是如果我进行重定向:
myRouter.route("/bar").post((req: Request, res: Response): Response => {
return res.redirect("/baz"); // redirect() returns void!
});
那个无法编译,因为redirect()
返回的是void而不是Response
。
选项:
- 简单的解决方法是使路由返回
any
,但如果可能的话,我想避免这种情况 - 我看到过一些代码使用
as unknown as Response
,但那似乎是一种hack方法
如何正确声明路由的返回类型,而不使用any
?
return res.send()
,而改用res.send()
和res.redirect()
。如果没有返回值且只是想结束函数执行,则不需要使用return
,只需使用return;
即可。我一直不喜欢return res.send()
语法,即使在普通的Javascript中也是如此,因为它暗示着有一个有意义的返回值被返回了,这并不是实际情况。 - jfriend00post(...): void
更好吗? - lonix.post()
返回什么的问题,而是关于您传递给它的回调函数返回什么以及如何声明回调函数以匹配它。回调函数应该不返回任何内容。所有.post()
做的就是注册回调函数,以便稍后调用,并返回调用它的对象,以便可以链接其他操作。.post()
本身在服务器初始化时被调用(以注册路由处理程序),而不是在实际访问路由时调用。传递给.post()
的回调函数是作为路由处理程序调用的。 - jfriend00RequestHandler
回调被定义为(req: Request, res: Response, next: NextFunction): any;
... 所以它返回any
,所以我很高兴也这样做。不过,你关于不必要地返回的评论很有帮助(在其他语言中我会这样做)。 - lonix