Mongoose从5升级到6后调用mongoose.Types.ObjectId()报TypeScript类型错误
问题背景
我近期对项目依赖做了版本升级,相关依赖版本变动如下:
- mongodb:从
3.5.4升级到4.1.4 - mongoose:从
5.12.10升级到6.0.12
项目开发环境依赖为:typescript4.4.4、ts-node10.4.0
问题描述
升级后执行mongoose.Types.ObjectId()代码时出现如下TypeScript类型错误:
Value of type 'typeof ObjectId' is not callable. Did you mean to include 'new'?
已执行的排查操作:
- 已完全卸载项目内及全局安装的
@types/mongoose依赖,mongoose 6.x版本已自带内置类型声明,无需额外安装类型包 - 该问题虽被Mongoose官方标记为已修复的Bug,但实际运行仍可复现
- 尝试使用
new mongoose.Types.ObjectId()方式规避类型报错,会引发其他运行时异常,无法作为最终解决方案
可行解决方案
方案1:替换为官方推荐API(推荐)
使用内置的createFromHexString方法生成ObjectId,完全兼容类型声明且无运行时问题:
// 从16进制字符串转换为ObjectId const existingId = mongoose.Types.ObjectId.createFromHexString(hexString)
如你需要生成全新的ObjectId,可先排查new关键字触发运行时异常的根因(大概率是入参格式不合法导致),修复后即可正常使用new mongoose.Types.ObjectId()生成新ID。
方案2:临时类型断言(适合旧代码兼容场景)
无需修改原有调用逻辑,仅添加类型断言即可消除类型报错:
const id = (mongoose.Types.ObjectId as unknown as () => mongoose.Types.ObjectId)()
方案3:升级Mongoose到修复版本
mongoose 6.2.0及以上稳定版本已彻底修复该类型声明缺陷,直接升级到对应版本即可从根源解决问题。
内容的提问来源于stack exchange,提问作者user2620132
相关产品推荐
相关产品推荐

