使用Interface重构Mongoose Schema时默认值报错的解决咨询
解决Mongoose Schema转TypeScript Interface的类型错误
错误原因
你混淆了TypeScript Interface和Mongoose Schema的作用:
- Interface是用来定义文档数据的类型结构,描述从数据库取出的对象的字段类型。
- Mongoose Schema是用来配置MongoDB的集合结构,包含字段类型、默认值等数据库层面的规则。
你把Schema的配置对象直接写到Interface里,导致TypeScript错误地将{ type: Date, default: Date.now() }当成了timestamp的字段类型,自然会触发类型报错。
正确写法
1. 定义正确的TypeScript Interface
只声明每个字段的实际数据类型,不用写Schema配置:
interface IMySchema { rating: number; // 使用TypeScript小写基础类型,而非构造函数Number timestamp: Date; }
2. 结合Interface创建Mongoose Schema
Schema的配置(类型、默认值等)依然写在mongoose.Schema的参数中,同时将Interface作为泛型传入以获得类型校验:
const MySchema = new mongoose.Schema<IMySchema>({ rating: Number, timestamp: { type: Date, default: Date.now // 注意不要加括号,传函数引用才会在插入时生成当前时间 } });
关键注意点
- Interface中使用TypeScript原生基础类型(
number/string/Date),避免使用Number/String这类构造函数类型,后者是对象类型,不符合文档字段的实际类型。 default: Date.now不要加括号:加括号会在Schema创建时立即执行,导致所有新文档的timestamp固定为Schema创建时间;传函数引用时,Mongoose会在插入文档时调用该函数生成实时时间。
内容的提问来源于stack exchange,提问作者Zoltan Hernyak
相关产品推荐
相关产品推荐

