You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript扩展express-session会话对象失败,求解决方案

解决TypeScript扩展express-session SessionData的类型错误

问题重现

尝试扩展express-session的会话对象,添加xcsrftoken属性时,编译报错:

Property 'xcsrftoken' does not exist on type 'Session & Partial<SessionData>'

相关代码文件如下:

src/types/express/index.d.ts

import account_document from "../account/account-document"
import xcsrftoken from "../data-types/x-csrf-token"

declare global {
    namespace Express {
        interface Request {
            authenticated_user: account_document
        }
        interface SessionData {
            xcsrftoken: xcsrftoken
        }
    }
}

src/types/express-session/index.d.ts

import xcsrftoken from "../data-types/x-csrf-token";

declare module "express-session" {
    interface SessionData {
        xcsrftoken: xcsrftoken
    }
}

tsconfig.json

{
    "compilerOptions": {
        "target": "ES2017",
        "module": "commonjs",
        "strict": true,
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "esModuleInterop": true,
        "typeRoots": ["./src/types/express", "./src/types/express-session", "./node_modules/@types"]
    },
    "exclude": ["node_modules"]
}

解决方案

1. 修正tsconfig.json的typeRoots配置

typeRoots需指向包含类型模块的根目录,而非具体子目录,修改后配置如下:

{
    "compilerOptions": {
        "target": "ES2017",
        "module": "commonjs",
        "strict": true,
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "esModuleInterop": true,
        "typeRoots": ["./src/types", "./node_modules/@types"]
    },
    "exclude": ["node_modules"]
}

2. 合并冗余类型声明

删除src/types/express/index.d.ts中的SessionData声明,保留Request扩展即可:

import account_document from "../account/account-document"

declare global {
    namespace Express {
        interface Request {
            authenticated_user: account_document
        }
    }
}

3. 确保类型文件被识别为模块

在src/types/express-session/index.d.ts末尾添加空导出,确保文件被视为模块处理:

import xcsrftoken from "../data-types/x-csrf-token";

declare module "express-session" {
    interface SessionData {
        xcsrftoken: xcsrftoken
    }
}

export {};

4. 处理Partial类型提示(可选)

若仍出现Partial<SessionData>相关错误,可通过类型断言明确类型:

if (!(req.session as typeof req.session & { xcsrftoken: xcsrftoken }).xcsrftoken) {
    (req.session as typeof req.session & { xcsrftoken: xcsrftoken }).xcsrftoken = {};
}

完成以上步骤后,TypeScript即可正确识别req.session.xcsrftoken的类型,不再报错。

内容的提问来源于stack exchange,提问作者iKingNinja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:47:39