Express.js转TypeScript时Mongoose模型类型问题咨询
Mongoose TypeScript 迁移常见问题解答
1. timestamps 字段是否需要在接口中声明
必须声明。
当前没有类型报错不代表类型定义正确:TypeScript 不会根据 Schema 配置里的timestamps: true自动推导注入的时间戳字段,如果你不在User接口中显式声明,后续访问 hydrated 文档上的createdAt、updatedAt属性时,TS 会直接抛出「属性不存在」的类型错误。运行时 Mongoose 确实会自动生成这两个字段,只是类型层面没有同步识别。
直接在接口中补充对应字段即可,默认配置下两个字段类型均为Date:
export interface User { name: string; active: boolean; createdAt: Date; updatedAt: Date; }
如果你自定义了 timestamps 的字段名,对应替换为实际配置的字段名即可。
2. /^find/ 正则匹配 pre 钩子的类型错误修复
报错根因:Mongoose 对正则匹配的中间件,默认将this绑定为单个 Document 文档类型,但find()方法是 Query 查询实例的方法,不存在于 Document 类型上,因此 TS 会报属性不存在的错误。
修复方式为显式指定中间件内this的类型为 Mongoose 的 Query 类型,两种写法均可:
- 写法1:给 pre 方法传入泛型参数
// 记得先从mongoose引入Query类型 import { Schema, Query } from 'mongoose'; UserSchema.pre<Query<User, User>>(/^find/, async function (next) { this.find({ active: { $ne: false } }); next(); });
- 写法2:在函数参数上直接声明this类型
UserSchema.pre(/^find/, async function (this: Query<User, User>, next) { this.find({ active: { $ne: false } }); next(); });
额外提示:你贴的代码里active字段配置存在拼写错误,
deafult: true应为default: true,否则默认值配置不会生效。
内容的提问来源于stack exchange,提问作者Vivek V Dwivedi
相关产品推荐
相关产品推荐

