扩展护照用户参数的快递请求

Ger*_*son 10 express typescript passport.js typescript2.0

我正在使用 Passport 处理 Express 应用程序的身份验证。这将用户设置为 Express 响应。我正在使用 TypeScript,因此在路由定义中将请求类型设置为 Request 会出错,因为 Express Request 中不存在用户对象。通过声明合并扩展接口来扩展请求有很多问题,但这些会导致另一个错误。我的文件看起来像这样:

import { Router, Request, Response }  from 'express'
import { User as CustomUser } from './user'

interface IRequest extends Request {
  user: CustomUser
}

const router: Router = Router()

router.get('/', requiresLogin, (req: IRequest, res: Response) => {
  console.log(req.user)
  res.sendStatus(204)
})
Run Code Online (Sandbox Code Playgroud)

但现在我在快速回调中得到以下 TypeScript:

Argument of type '(req: IRequest, res: Response) => void' is not assignable to parameter of type 'RequestHandlerParams'. Type '(req: IRequest, res: Response) => void' is not assignable to type '(RequestHandler | ErrorRequestHandler)[]'. Property 'includes' is missing in type '(req: IRequest, res: Response) => void'.
Run Code Online (Sandbox Code Playgroud)

我最近升级到 TypeScript v2.8.3,以前从未遇到过这个问题。

Bor*_*uhh 2

我刚刚遇到了类似的问题并这样解决:

\n\n
import { Router, Request, Response } from \'express\';\nimport { User as CustomUser } from \'./user\';\n\nconst router: Router = Router();\n\nrouter.get(\'/\', requiresLogin, (req: Request, res: Response) => {\n  console.log(req.user as CustomUser);\n  res.sendStatus(204);\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

我没有增加 Express.js 请求类型,而是只是使用类型断言告诉 TypeScript req.user 将是 CustomUser 类型。这似乎正是文档中引用的场景“有时你\xe2\x80\x99ll最终会遇到这样的情况:你\xe2\x80\x99ll比TypeScript更了解一个值。”

\n\n

https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions

\n\n

现在我知道你在想什么了。“如果没有用户怎么办?这不是违背了 Typescript 的目的吗?”。好吧,让我们看看这个。如果您使用 Passport.js,那么在没有用户的情况下您不应该走到这一步。此代码应该位于您的 Passport 配置中的某个位置:

\n\n
if (!user) {\n  /** Set status code to Unauthorized */\n  res.status(401);\n\n  return next(err);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

至于击败 Typescript……也许你是对的。如果有人对这种情况有更好的答案,我会洗耳恭听。

\n