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

Typegoose模型save方法返回类型不匹配Todo类型报错如何修复?

Typegoose save方法类型不匹配问题修复方案

报错根因

getModelForClass生成的Mongoose模型默认返回原生Document类型实例,和你自定义的Todo实体类类型没有自动关联,导致save方法返回值不符合Promise<Todo>的类型定义。

修复步骤

    1. 配置Todo实体自动管理时间戳
      修改entities/todo.ts,导入modelOptions并开启时间戳配置,避免手动赋值时间字段出错:
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;
}
    1. 修正create方法的返回值类型
      修改model.ts的create方法,将Mongoose Document实例转换为纯对象匹配Todo类型,同时可以给模型添加泛型提升类型匹配度:
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;
  }
}
    1. 验证tsconfig配置
      确保项目根目录的tsconfig.json包含以下配置,避免装饰器相关类型报错:
{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "strictPropertyInitialization": false,
    "esModuleInterop": true
  }
}

完成以上修改后,类型报错就会消失,create方法的返回值会正确匹配Todo类型定义。

内容的提问来源于stack exchange,提问作者user2285831

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 10:54:08