Typegoose模型save方法返回类型不匹配Todo类型报错如何修复?
Typegoose save方法类型不匹配问题修复方案
报错根因
getModelForClass生成的Mongoose模型默认返回原生Document类型实例,和你自定义的Todo实体类类型没有自动关联,导致save方法返回值不符合Promise<Todo>的类型定义。
修复步骤
- 配置Todo实体自动管理时间戳
修改entities/todo.ts,导入modelOptions并开启时间戳配置,避免手动赋值时间字段出错:
- 配置Todo实体自动管理时间戳
import { ObjectType, Field } from "type-graphql"; // 新增导入modelOptions import { prop, modelOptions } from "@typegoose/typegoose"; import { ObjectId } from "mongodb"; @ObjectType() // 新增模型配置,自动管理createdAt、updatedAt @modelOptions({ schemaOptions: { timestamps: true } }) export class Todo { @Field() readonly _id!: ObjectId; @prop() @Field(() => Date) createdAt!: Date; @prop() @Field(() => Date) updatedAt!: Date; @prop() @Field() content!: string; @prop({ default: false }) @Field() isDone!: boolean; }
- 修正create方法的返回值类型
修改model.ts的create方法,将Mongoose Document实例转换为纯对象匹配Todo类型,同时可以给模型添加泛型提升类型匹配度:
- 修正create方法的返回值类型
import { getModelForClass } from "@typegoose/typegoose"; import { ObjectId } from "mongodb"; import { Todo } from "../../entities"; import { NewTodoInput } from "./input"; // 给模型添加Todo泛型 export const TodoMongooseModel = getModelForClass<Todo>(Todo); export default class TodoModel { async getById(_id: ObjectId): Promise<Todo | null> { return TodoMongooseModel.findById(_id).lean().exec(); } async create(data: NewTodoInput): Promise<Todo> { const todo = new TodoMongooseModel(data); const savedDoc = await todo.save(); // 转换为纯对象后断言为Todo类型 return savedDoc.toObject() as Todo; } }
- 验证tsconfig配置
确保项目根目录的tsconfig.json包含以下配置,避免装饰器相关类型报错:
- 验证tsconfig配置
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true, "strictPropertyInitialization": false, "esModuleInterop": true } }
完成以上修改后,类型报错就会消失,create方法的返回值会正确匹配Todo类型定义。
内容的提问来源于stack exchange,提问作者user2285831
相关产品推荐
相关产品推荐

