快速会话 1.17.1+ ( req.session.myUserId )

Express Sessions 1.17.1+ ( req.session.myUserId )

我注意到 express-session 1.17.1+ 中的变化,所以我不能只将自定义 属性(如 req.session.userId)放入 req.session。它会导致类型检查错误。 我尝试扩展 SessionData、Object.defineProperty 和许多其他选项,但由于某种原因,它不起作用。请帮忙!

我写了一个简单的代码来清楚地重现问题here

我也遇到了同样的问题。然后意识到最新版本(https://github.com/DefinitelyTyped/DefinitelyTyped/commit/d1259ee31e6b17c31a5a86e27a0d12f3ec7c5a19#diff-0d13c95494fa97febecd0fbc1fb1b8f6e17bbcaedb8c88d10a0b655046e1c97b)中的行为发生了变化。如下定义必填字段以使其工作。

declare module 'express-session' {
    interface SessionData {
        userId: string;
    }
}

我 运行 遇到了这个完全相同的问题。

pull request 上有很多关于这个问题的讨论。 https://github.com/DefinitelyTyped/DefinitelyTyped/pull/46576

综上所述,在您的express-session.d.ts文件中,您需要像下面这样导入包并声明模块,以便声明合并生效。

import 'express-session';

declare module 'express-session' {
  interface SessionData {
    userId: number;
  }
}

然后您希望在 tsconfig.json 文件中指定 typeRoots,以便编译器选择您的自定义声明文件。

根据您的存储库,您的 typeRoots 看起来应该是:

"typeRoots": ["./src/@types", "./node_modules/@types"]

也许这对你有用,我分享给你以节省时间。

修改文件tsconfig.json并添加

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

创建包含以下内容的文件:@types/express/index.d.ts

import "express-session";

// what we are all looking to solve xD
// req.session.propertyX
declare module "express-session" {
    interface SessionData {
        propertyX: number;
    }
}

// additional properties on other objects
// req.propertyY
declare global {
    namespace Express {
        interface Request {
            propertyY: number;
        }
    }
}

希望它对你有用,并节省时间。