如何确定Passport JS中的typescript req.user永远不会是undefined?

6
当使用 Passport JS 时,路由中的 req.user 可能会被视为未定义。但是,在我的路由方法之前的中间件确保这不是问题。如何告诉 TypeScript 这一点? 对象可能未定义。 示例:
someMethod = async (req: Request, res: Response) => {
  const { user } = req
  const userId: number = user.id
}

在上述TypeScript代码中,因为user.id可能未定义,所以会抛出一个错误。
我可以做类似这样的操作:
if (!user) return
const userId: number = user.id

但是我认为在我的方法中反复重复这段代码并不是最好的做法,因为中间件已经在路由方法之前执行了这个操作。


如果你的 TypeScript 版本支持可选链,那么可以使用 user?.id - painotpi
1
实际上我不能这样做,因为它会返回未定义的值。我正在一个函数中使用这个值,该函数期望用户ID是一个数字。 - Luna
TS只是希望在尝试访问“user”的“id”之前进行空值检查,因此添加这个检查不会有任何害处;由于“user”始终具有值,因此当您尝试访问“user?.id”时,您将获得一个值。 - painotpi
如果您想要快速解决问题,请使用 //@ts-ignore。如果您想要比这更优雅的解决方案,您需要扩展 Express.Request 接口。 - glinda93
1个回答

0
我建议您简单地声明全局Express命名空间,并使用您需要的参数,就像这样:
declare global {
  namespace Express {
    interface Request {
      user: User //or other type you would like to use
    }
  }
}

之后,您将能够使用req.user而无需使用//@ts-ignore或可选链接。

someMethod = async (req: Request, res: Response) => {
  const { user } = req
  const userId: number = user.id //user will be defined
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接