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
相关产品推荐
相关产品推荐

