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

Mongoose 6.0.5版本使用$push操作符出现TypeScript类型错误

问题根因

Mongoose 6.0.1之后的版本收紧了UpdateQuery的TypeScript类型校验规则,你的报错来自两个类型不匹配问题:

  1. 接口定义与Schema存储类型不一致:INotifications中notificationReplyTravaux定义为PopulatedDoc<IReplyTravaux & Document>[],但Schema中该字段实际存储的是字符串类型的关联ID,类型定义的偏差导致TS推导$push的允许值时直接判定为undefined。
  2. 传入值与存储类型不匹配:你执行$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:06:02