Typescript 声明合并 Express 请求对象和 Passport.js User/Session

Typescript Declaration Merging Express Request Object and Passport.js User/Session

我在 express/nodejs 应用程序中使用 passportjs 中间件进行身份验证。尽管已按照 Declaration Merging.

的步骤操作,但我的 request.user 对象的属性出现错误

我在我的项目根目录 /types/index.d.ts 创建了一个文件,并将以下内容添加到我的 tsconfig.json

"typeRoots": [
  "/types/index.ts", "node_modules/@types"
]

我的全局声明合并如下所示:

import { User } from "../users/user.interface";
declare global {
  namespace Express {
    export interface Request {
        user: User;
    }
  }
}

** 更新 ** 通过将声明合并更改为模块扩充,我得到了 req.user 对象以停止抛出错误:

import { User } from "../users/user.interface";

declare module "express-serve-static-core" {
    interface Request {
        user: User;
    }
}

引用 request.session 对象时出现以下错误:Property 'session' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.

passport 的@types/passport 类型是否应该与 express 的请求对象合并以添加会话?

有谁知道我如何才能成功消除这些错误/让 TS 识别这个声明合并。我是打字稿的新手,已经能够解决我遇到的大部分问题,但这个问题一直在浮出水面。

要扩展 Passport 使用的 User 类型,您可以将声明合并到 global.Express.User:

declare global {
  namespace Express {
    interface User {
        /* declare your properties here */
    }
  }
}

@types/passport do not define global.Express.Request#session, that is defined by @types/express-session here.

提供的类型定义