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

Mongoose 6内置TypeScript类型下$inc操作符类型报错问题咨询

问题根因

该问题不是Mongoose 6的类型定义错误,也不是$inc操作规则变更,是你自定义的TS接口写法不符合Mongoose 6内置类型的推导要求导致的。

出错的两个核心原因

  • 定义接口时错误使用了大写的String、NumberJS包装类型,应该用TS原生的小写string、number原始类型,类型不匹配导致Mongoose的UpdateQuery无法正确识别currentBatch是数字类型,推导$inc的可操作字段时将其判定为undefined。
  • Mongoose 6开始官方不推荐自定义数据接口直接继承Document类型,自带的Document属性会干扰自定义字段的类型推导,导致操作符的字段校验异常。

修正后的代码示例

第一步:修正接口定义

import { HydratedDocument, Schema, model, UpdateQuery } from 'mongoose'

// 定义纯数据接口,用小写原始类型,不直接继承Document
export interface PrintSettings {
  _id: string
  currentBatch: number
}

// 如果需要使用带Mongoose文档方法的类型,用HydratedDocument包装
export type PrintSettingsDocument = HydratedDocument<PrintSettings>

第二步:修正Schema与模型定义

const PrintSettingsSchema: Schema<PrintSettings> = new Schema(
  {
    _id: { type: String },
    currentBatch: { type: Number, default: 0, min: 0 },
  },
  { timestamps: true }
)

// 模型绑定HydratedDocument类型
const PrintSettingsModel = model<PrintSettingsDocument>('PrintSettings', PrintSettingsSchema)

第三步:更新操作(无类型报错)

// Mongoose 6已默认关闭useFindAndModify,该参数可省略
let inc = await PrintSettingsModel.findOneAndUpdate(
  { _id: settingsId },
  { $inc: { currentBatch: 1 } },
  { new: true }
)

临时兼容方案

如果升级过程中需要快速兼容,可以对update参数加类型断言绕开校验:

let inc = await PrintSettingsModel.findOneAndUpdate(
  { _id: settingsId },
  { $inc: { currentBatch: 1 } } as UpdateQuery<PrintSettingsDocument>,
  { new: true }
)

内容的提问来源于stack exchange,提问作者F22lightning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:15:01