Typescript mongoose static model method “Property does not exist on type”

后端 未结 5 965
囚心锁ツ
囚心锁ツ 2020-12-12 17:58

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          


        
5条回答
  •  我在风中等你
    2020-12-12 18:46

    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

    1. Rename IUser to IUserDocument. This is to separate your schema from your instance methods.
    2. Import Document from mongoose.
    3. Extend the interface from Document.

    Model file

    1. Rename all instances of IUser to IUserDocument, including the module path if you rename the file.
    2. Rename only the definition of IUserModel to IUser.
    3. Change what IUser extends from, from IUserDocument, Document to IUserDocument.
    4. Create a new interface called IUserModel which extends from Model.
    5. Declare your static methods in IUserModel.
    6. Change the User constant type from Model to IUserModel, as IUserModel now extends Model.
    7. Change the type argument on your model call from 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;
    }
    

提交回复
热议问题