【问题标题】:Return type for Express routes with TypeScript使用 TypeScript 的 Express 路由的返回类型
【发布时间】:2019-07-03 08:29:29
【问题描述】:

我正在尝试充分利用 TypeScript,因此我尽可能避免使用 any

我见过这样定义的 Express 路由:

import { Request, Response } from "express";

myRouter.route("/foo").post((req: Request, res: Response): Response => {
  return res.send("Hello World");
});

因为send() 返回一个快递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,声明路由返回类型的正确方法是什么?

【问题讨论】:

  • 嗯,Express 并不关注返回值,所以正确的使用方法是定义无返回值的回调,并且不返回值。所以,别再做return res.send()了,只做res.send()res.redirect()。停止使用return。如果没有返回值并且您只是想完成函数的执行,则不需要return,那么只需使用普通的return;。无论如何,我总是不喜欢 return res.send() 语法,即使在纯 Javascript 中也是如此,因为它意味着在不是这种情况时会在那里返回一个有意义的返回值。
  • @jfriend00 类型声明了一个返回值...所以你认为最好忽略它们并将其声明为post(...): void 吗?
  • 没有。你找错地方了。这与.post() 返回的内容无关。这是关于您传递给它的回调返回什么以及如何声明回调以匹配它。回调不应返回任何内容。所有.post() 都注册了回调,以便以后可以调用它并返回它被调用的对象,以便可以链接事物。 .post() 本身在服务器初始化时被调用(以注册路由处理程序)——当路由实际被命中时它不会被调用。传递给.post() 的回调就是所谓的路由处理程序。
  • @jfriend00 卫生部!你说得对!当我创建问题时,我没有粘贴我的真实代码 - 我的处理程序在一个单独的类中,因此它们更容易测试,当我输入上面的内容时,我查看了错误的声明文件。你是对的 - RequestHandler 回调定义为 (req: Request, res: Response, next: NextFunction): any;... 所以它返回 any 所以我很乐意这样做。不过,您关于不要不必要地返回的评论很有帮助(我会用其他语言做什么)。
  • 我不是 TypeScript 专家,所以没有推荐。我不喜欢在调用者不使用返回值时返回值的代码(因为我认为它会产生误导性代码)所以我可能会做一些与此一致的事情。

标签: node.js typescript express


【解决方案1】:

根据@jfriend的cmets,回调的declaration for RequestHandler是:

(req: Request, res: Response, next: NextFunction): any;

所以在这种情况下使用any 是可以的。

但是,将其声明为 void 可能会更好,因为 Express 不期望返回值。这就是我正在做的事情,我认为这里的输入是“错误的”(如果不是这种情况并且有有效的用例,请告诉我)。

【讨论】:

  • void 可能是更好的选择,因为它是确切的返回类型
  • 看起来他们从那时起改进了RequestHandler 的类型。截至今天,它是(req: Request<P, ResBody, ReqBody, ReqQuery>, res: Response<ResBody>, next: NextFunction): void;
猜你喜欢
  • 2020-07-27
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2019-12-01
  • 2015-09-20
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多