I am currently trying to add a static method to my mongoose schema but I can\'t find the reason why it doesn\'t work this way.
My model:
import * as
I was having the same problem as you, and then finally managed to resolve it after reading the documentation in the TS mongoose typings (which I didn't know about before, and I'm not sure how long the docs have been around), specifically this section.
As for your case, you'll want to follow a similar pattern to what you currently have, although you'll need to change a few things in both files.
IUser file
IUser to IUserDocument. This is to separate your schema from your instance methods.Document from mongoose.Document.Model file
IUser to IUserDocument, including the module path if you rename the file.IUserModel to IUser.IUser extends from, from IUserDocument, Document to IUserDocument.IUserModel which extends from Model.IUserModel.User constant type from Model to IUserModel, as IUserModel now extends Model. to .Here's what your model file would look like with those changes:
import * as bcrypt from 'bcryptjs';
import { Document, Schema, Model, model } from 'mongoose';
import { IUserDocument } from '../interfaces/IUserDocument';
export interface IUser extends IUserDocument {
comparePassword(password: string): boolean;
}
export interface IUserModel extends Model {
hashPassword(password: string): string;
}
export const userSchema: Schema = new Schema({
email: { type: String, index: { unique: true }, required: true },
name: { type: String, index: { unique: true }, required: true },
password: { type: String, required: true }
});
userSchema.method('comparePassword', function (password: string): boolean {
if (bcrypt.compareSync(password, this.password)) return true;
return false;
});
userSchema.static('hashPassword', (password: string): string => {
return bcrypt.hashSync(password);
});
export const User: IUserModel = model('User', userSchema);
export default User;
And your (newly renamed) ../interfaces/IUserDocument module would look like this:
import { Document } from 'mongoose';
export interface IUserDocument extends Document {
email: string;
name: string;
password: string;
}