Search code examples
node.jstypescriptmongoosegraphqltypegoose

my typegoose save function didn't return needed type (NodeJs, typescript, graphql)


My function save of an object (in model.ts file) which is created by typegoose should return Promise<Todo> but it returns Promise<Document<any, {}>> and i have this error :

Type 'Document<any, {}>' is missing the following properties from type 'Todo': createdAt, updatedAt, content, isDone

How should i correct this ?

model ts

import { getModelForClass } from "@typegoose/typegoose";
import { ObjectId } from "mongodb";

import { Todo } from "../../entities";
import { NewTodoInput } from "./input";

// This generates the mongoose model for us
export const TodoMongooseModel = getModelForClass(Todo);

export default class TodoModel {
  async getById(_id: ObjectId): Promise<Todo | null> {
    // Use mongoose as usual
    return TodoMongooseModel.findById(_id).lean().exec();
  }

  async create(data: NewTodoInput): Promise<Todo> {
    const todo = new TodoMongooseModel(data);

    return todo.save();
  }
}

input ts

import { Field, InputType, ID } from "type-graphql";
import { MaxLength, MinLength } from "class-validator";

@InputType()
export class NewTodoInput {
  @Field()
  @MaxLength(300)
  @MinLength(1)
  content: string | undefined;

}

entities todo ts

import { ObjectType, Field } from "type-graphql";
import { prop } from "@typegoose/typegoose";
import { ObjectId } from "mongodb";

@ObjectType()
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;
}

Thank you.


Solution

  • with the unofficial mongoose types, it is an known problem that await document.save() does not return the correct typings
    -> this is not an problem with typegoose, it is with @types/mongoose

    the workaround is to use:

    await doc.save();
    return doc;
    

    (or maybe in your case directly use the mongoose provided function .create)

    PS: this is not a problem in the official types of mongoose (can be currently used with typegoose 8.0.0-beta.x)