Mongoose 6.0.5版本使用$push操作符出现TypeScript类型错误
问题根因
Mongoose 6.0.1之后的版本收紧了UpdateQuery的TypeScript类型校验规则,你的报错来自两个类型不匹配问题:
- 接口定义与Schema存储类型不一致:
INotifications中notificationReplyTravaux定义为PopulatedDoc<IReplyTravaux & Document>[],但Schema中该字段实际存储的是字符串类型的关联ID,类型定义的偏差导致TS推导$push的允许值时直接判定为undefined。 - 传入值与存储类型不匹配:你执行
$push时传入了完整的IReplyTravaux文档对象,虽然运行时Mongoose会自动提取_id存入数据库,功能可正常执行,但类型层面与Schema定义的String存储类型不匹配,触发校验报错。
解决方案
方案1:调整传入参数(推荐)
执行$push时明确传入ID字段即可匹配类型,写法参考:// 原写法 await NotificationModel.updateOne(filter, { $push: { notificationReplyTravaux: replyTravauxInstance } }) // 修改后写法 await NotificationModel.updateOne(filter, { $push: { notificationReplyTravaux: replyTravauxInstance._id } })方案2:统一接口与Schema的类型定义
调整INotifications的字段类型,兼容未填充和已填充两种状态:export interface INotifications extends mongoose.Document { user: string, // 兼容存储的字符串ID和填充后的文档对象两种格式 notificationReplyTravaux: (string | PopulatedDoc<IReplyTravaux & Document>)[], notificationOrder: (mongoose.Types.ObjectId | PopulatedDoc<IArchivedOrder & Document>)[], }调整后传入完整文档对象或者ID都可以通过类型校验。
方案3:临时绕开类型校验(不推荐,仅应急使用)
给更新参数加类型断言强制跳过校验:await NotificationModel.updateOne(filter, { $push: { notificationReplyTravaux: replyTravauxInstance } } as mongoose.UpdateQuery<INotifications>)
内容的提问来源于stack exchange,提问作者lulu33
相关产品推荐
相关产品推荐

