Node.js 使用TypeScript的快速路线的返回类型

Node.js 使用TypeScript的快速路线的返回类型,node.js,typescript,express,Node.js,Typescript,Express,我试图使用TypeScript来充分发挥它的潜力,所以如果可能的话,我会避免使用任何 我见过这样定义的快速路线: import { Request, Response } from "express"; myRouter.route("/foo").post((req: Request, res: Response): Response => { return res.send("Hello World"); }); 这是因为send()返回一个快速响应 但如果我重定向: myRo

我试图使用TypeScript来充分发挥它的潜力,所以如果可能的话,我会避免使用任何

我见过这样定义的快速路线:

import { Request, Response } from "express";

myRouter.route("/foo").post((req: Request, res: Response): Response => {
  return res.send("Hello World");
});
这是因为
send()
返回一个快速
响应

但如果我重定向:

myRouter.route("/bar").post((req: Request, res: Response): Response => {
  return res.redirect("/baz");         // redirect() returns void!
});
无法编译,因为
redirect()
返回void,而不是
Response

选项:

  • 最简单的解决方法是使路线返回
    任意
    ,但如果可能的话,我希望避免这种情况
  • 我见过像响应一样未知的
    代码,但这似乎是一种黑客行为

在不使用
任何
的情况下,声明路线返回类型的正确方法是什么?

根据@jfriend的评论,回调的方法是:

因此,在这种情况下使用
any
是可以的


但是,将其声明为
void
可能更好,因为Express不希望返回值。这就是我正在做的,我认为这里的键入是“错误的”(如果不是这样,并且有一个有效的用例,请让我知道)。

好吧,Express不关注返回值,所以正确的使用方法是定义无返回值的回调,而不返回值。因此,停止执行
返回res.send()
,只需执行
res.send()
res.redirect()
。停止使用
返回按钮
。如果没有返回值并且您只是试图完成函数的执行,则不需要
return
,只需使用普通的
return。无论如何,我都不喜欢
return res.send()
语法,即使在普通Javascript中也是如此,因为它意味着返回一个有意义的返回值,而事实并非如此。@jfriend00键入声明了一个返回值。。。因此,您认为最好忽略它们并将其声明为
post(…):void
?不,您找错地方了。这与
.post()
返回的内容无关。这是关于您传递的回调返回的内容,以及如何声明回调来匹配它。回调不应返回任何内容。All
.post()
是否注册回调以便稍后调用它,并返回调用它的对象以便链接事物
.post()
本身在服务器初始化时被调用(以注册路由处理程序)-当路由实际被命中时,它不会被调用。传递给
.post()
的回调称为路由处理程序。@jfriend00 DOH!你说得对!当我创建这个问题时,我没有粘贴我真正的代码——我的处理程序在一个单独的类中,因此它们更容易测试,当我键入上述内容时,我查看了错误的声明文件。您是对的,
RequestHandler
回调被定义为
(req:Request,res:Response,next:NextFunction):any。。。所以它返回
any
,所以我很乐意这样做。不过,你关于不要不必要地返回的评论很有帮助(我会在其他语言中这样做)。我不是打字专家,所以这里没有建议。我不喜欢在调用方不使用返回值时返回值的代码(因为我认为这会产生误导性代码),所以我可能会做一些与此一致的事情。
void
可能是更好的选择,因为它是精确的返回类型,从那时起,他们似乎改进了
RequestHandler
的类型。今天,它是
(req:Request,res:Response,next:NextFunction):void
(req: Request, res: Response, next: NextFunction): any;