【发布时间】: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