使用 TypeScript 的 Express 路由的返回类型

lon*_*nix 9 node.js express typescript

我正在尝试充分利用 TypeScript,所以我any尽可能避免。

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

import { Request, Response } from "express";

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

这是有效的,因为send()返回一个 express Response

但是如果我做一个重定向:

myRouter.route("/bar").post((req: Request, res: Response): Response => {
  return res.redirect("/baz");         // redirect() returns void!
});
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为redirect()返回 void,而不是Response.

选项:

  • 简单的解决方法是让路线返回any,但我想尽可能避免这种情况
  • 我见过可以执行的代码,as unknown as Response但这似乎是一个 hack

在不使用的情况下声明路由返回类型的正确方法是什么any

lon*_*nix 20

根据@jfriend 的评论,RequestHandler的回调声明是:

(req: Request, res: Response, next: NextFunction): any;
Run Code Online (Sandbox Code Playgroud)

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

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

  • `void` 可能是更好的选择,因为它是确切的返回类型 (2认同)
  • 从那时起,他们似乎改进了“RequestHandler”的类型。截至今天,它是 `(req: Request<P, ResBody, ReqBody, ReqQuery>, res: Response<ResBody>, next: NextFunction): void;`。 (2认同)