TypeScript Mongoose Schema:_created字段默认当前时间设置方法
问题本质
你遇到的所有报错,核心原因是混淆了TS类属性的类型声明规则和**@Prop装饰器的运行时配置传参要求**:
- TS类的属性声明语法是
属性名: 类型,冒号后面的内容会被TS当成类型定义去解析。你之前直接把整个Mongoose字段配置对象写在冒号后面,会触发语法解析错误;同时配置里的Date、getTime等值引用,会被TS误当成类型节点处理,才会出现「将值用作类型」「引用私有名称」这类奇怪的报错 - 所有Mongoose的字段规则(类型映射、默认值、索引配置等),都需要作为参数传入
@Prop()装饰器,不能直接内嵌在类属性的声明语句里
正确实现代码
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import mongoose, { Document } from 'mongoose'; @Schema({collection: 'collection.name'}) export class myCollection extends Document { @Prop() _id: mongoose.Schema.Types.ObjectId; @Prop() name: string; @Prop({ type: Date, // 箭头函数包裹,保证每次新建文档时动态获取当前时间 default: () => Date.now() }) _created: Date } export const myCollectionSchema = SchemaFactory.createForClass(myCollection)
各错误写法的对应修正说明
- 针对写法一的报错:不能把
_created : { type: Date, default: new Date() }直接写在类属性的位置,要把整个配置对象挪到@Prop()的括号内部 - 针对写法二的报错:不要直接把
default: Date.now作为配置值,用箭头函数包裹执行逻辑,避免TS在解析类导出成员时,把上下文的全局Date引用判定为越界访问 - 针对写法三的报错:不需要在类外部单独定义时间获取函数,直接把取值逻辑写在装饰器的default配置里即可,彻底避开外部非导出变量的类型引用歧义
额外注意事项
- 如果直接写
default: new Date(),会在Schema模块被加载的瞬间就执行一次生成固定时间值,不会在每条新文档创建时动态获取当前时间,一定要用函数形式的默认值- 注意
SchemaFactory的方法名是createForClass(Class首字母大写),之前的小写写法会触发方法不存在的运行时报错
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

