Dang Kien
Dang Kien

Reputation: 688

Issue with Date and Mongoose Typescript

I'm facing the issue with the Mongoose official document founded here.

import { Schema, Model, model } from 'mongoose';

export interface IUser {
  name: string;
  email: string;
  avatar?: string;
  created: Date;
}

const schema = new Schema<IUser, Model<IUser>, IUser>({
  name: { type: String, required: true },
  email: String,
  avatar: String,
  created: { type: Date, default: Date.now },
});

export const UserModel = model<IUser>('User', schema);

My problem is the created type in IUser is not the same as in schema and got the error:

Type '{ type: DateConstructor; default: () => number; }' is not assignable to type 'typeof SchemaType | Schema<any, any, undefined, unknown> | Schema<any, any, undefined, unknown>[] | readonly Schema<any, any, undefined, unknown>[] | Function[] | ... 6 more ... | undefined'.
  Types of property 'type' are incompatible.
    Type 'DateConstructor' is not assignable to type 'Date | typeof SchemaType | Schema<any, any, undefined, unknown> | undefined'.
      Type 'DateConstructor' is missing the following properties from type 'typeof SchemaType': cast, checkRequired, set, getts(2322)
(property) created?: typeof SchemaType | Schema<any, any, undefined, unknown> | Schema<any, any, undefined, unknown>[] | readonly Schema<any, any, undefined, unknown>[] | Function[] | ... 6 more ... | undefined

Please let me know how to fix this.

Upvotes: 4

Views: 4778

Answers (2)

Hailemariam Addisu
Hailemariam Addisu

Reputation: 16

I think this is working

 import { Schema,Document } from 'mongoose';
 export interface IUser {
     name: string;
     email: string;
    avatar?: string;
   created: Date;
}
const schema = new Schema<IUser>({
    name: { type: String, required: true },
    email: String,
    avatar: String,
    created: { type: Date, default: Date.now },

});

export const UserModel = model<IUser>('User', schema);

Upvotes: 0

Shivam Pandey
Shivam Pandey

Reputation: 3936

Date.now() is a function which returns number. Instead of it, try using new Date() only. Also need to make changes in the type of createdAt to Number.

In the given doc link, createdAt field type is number but here you have written Date.

interface User {
  name: string;
  email: string;
  avatar?: string;
  createdAt: number;
}

OR

createdAt and updatedAt are timestamps which can be used directly without specifying in the schema.

const schema = new Schema<IUser, Model<IUser>, IUser>({
  name: { type: String, required: true },
  email: String,
  avatar: String
},{
    timestamps: true
});

Upvotes: 4

Related Questions