Express-Session与JSDoc:为req.session修正自定义类型
解决express-session中req.session自定义属性的JSDoc类型提示问题
针对你遇到的三个问题,以及消除IDE报错的需求,直接给出解决方案:
1. 能否取消Partial的可选设置?
express-session默认把SessionData设为Partial是因为会话初始状态通常是空的,无法保证所有属性都存在。如果你想强制userId为必填项,可以通过自定义类型覆盖,但要注意实际运行时会话可能还未赋值userId,直接使用可能导致undefined错误。建议要么在类型里标记userId为可选(userId?: string|number),要么确保在使用req.session.userId前已经完成赋值。如果一定要取消Partial的可选性,直接定义非可选的自定义属性即可。
2. 用JSDoc定义包含userId的SessionData对象(消除报错)
有两种方式实现,按需选择:
方式一:局部函数参数注释(适合单个路由)
直接在路由处理函数的req参数上标注类型,明确session包含userId:
/** * @param {import('express').Request & { * session: import('express-session').Session & { userId: string | number } * }} req * @param {import('express').Response} res * @param {import('express').NextFunction} next */ app.get('/something', (req, res, next) => { let uid = req.session.userId; // 不再报错 });
方式二:全局自定义类型(适合全项目复用)
先在项目的某个公共文件(比如jsdoc-types.js)里定义自定义会话类型,然后在需要的地方引用:
// jsdoc-types.js /** * @typedef {import('express-session').Session & { * userId: string | number // 如果想设为可选,加个问号:userId?: string | number * }} CustomSession */ // 路由文件中引用 /** * @param {import('express').Request & { session: import('./jsdoc-types').CustomSession }} req */ app.get('/something', (req, res, next) => { let uid = req.session.userId; });
如果想让IDE全局识别这个自定义会话类型,可以用@augment扩展express-session的默认类型:
/** * @augments import('express-session').SessionData * @property {string|number} userId - 存储的用户ID */ function CustomSessionData() {}
这样所有地方的req.session都会自动包含userId的类型提示。
3. Type1 & Type2的作用
你猜的没错,这是交叉类型(TypeScript/JSDoc支持的类型操作),作用是把多个类型的属性合并成一个新类型。比如Session & { userId: string },就表示这个对象同时拥有Session类型的所有内置属性(比如id、cookie),以及自定义的userId属性。
内容的提问来源于stack exchange,提问作者pqzpkaot
相关产品推荐
相关产品推荐

