TypeScript中Mongoose.startSession类型定义及事务Session报错问题
Mongoose 事务 TypeScript 类型问题解答
报错核心原因
原封装的事务方法将回调参数定义为any类型,导致TypeScript无法推导session的正确类型,最终在调用Transit.create时匹配到了错误的函数重载分支,抛出TS2769类型不兼容错误。
核心类型说明
mongoose.startSession()的TypeScript返回类型为 Promise,该类型直接从官方 mongodb驱动包导出,并非Mongoose自定义类型。- 事务回调中的session参数,直接使用上述从
mongodb导入的ClientSession类型即可,不需要额外定义别名。
代码修复方案
- 修正事务封装函数的类型签名,移除
any类型,明确传入回调的参数类型和返回值类型:// 从mongodb包导入需要的类型 import type { ClientSession } from 'mongodb'; // 替换原有无类型的withTransaction方法 export async function withTransaction<T>( func: (session: ClientSession) => Promise<T> ): Promise<T> { const session = await mongoose.startSession(); session.startTransaction(); try { const operationResult = await func(session); await session.commitTransaction(); return operationResult; } catch (error) { await session.abortTransaction(); throw error; } finally { session.endSession(); } } - 修正Model.create方法的调用方式,匹配正确的类型重载:
Mongoose的create方法对单文档传参的重载规则存在差异:传入单个对象作为文档参数时,第二个参数不会被识别为配置选项(含session)。需要将单文档包装为数组形式,即可正确匹配带session配置的重载分支:return await withTransaction(async (session: ClientSession) => { // 文档参数包装为数组,匹配正确的方法重载 const [newTransit] = await Transit.create([userData], { session }); // 其余数据库操作按常规方式在第二个参数传入session配置即可 }) - 类型校验注意事项:不要从Mongoose的内部导出路径导入ClientSession类型,始终以
mongodb包导出的类型为准,避免版本匹配问题。
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

