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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:30:53