使用猫鼬模型设置打字稿

Posted

技术标签:

【中文标题】使用猫鼬模型设置打字稿【英文标题】:Setting up typescript with mongoose model 【发布时间】:2018-10-09 09:03:19 【问题描述】:

出于某种原因,打字稿不接受我的代码。在UserScema.pre 方法中,打字稿错误表明属性createdAtpassword 在类型文档(this) 上不存在。如何使 typescript 接口应用于此方法并返回 IUserDocument 对象?

import Schema, Model, Document, model from 'mongoose';
import bcrypt from 'bcrypt-nodejs';

export interface IUserDocument extends Document
    createdAt: Date,
    username: string,
    displayName: string,
    email: string,
    googleId: string,
    password: string,
    verifyPassword(password:string): boolean


let UserSchema: Schema = new Schema(
    createdAt:
        type:Date,
        default:Date.now   
    ,
    username: 
        type:String,
        lowercase:true  
    ,
    displayName: String,
    email: 
        type:String,
        lowercase:true
    ,
    googleId: String,
    password: String
);

UserSchema.pre('save', function(next)
    var user = this;

    if(!this.createdAt) this.createdAt = Date.now;

    if(user.isModified('password')) 
        bcrypt.genSalt(10, function(err:any, salt:number)
            bcrypt.hash(user.password, salt, null, function(err:any, hash:string)
                if(err) return next(err);
                user.password = hash; 
                next();
            );
        );
     else
        return next();
    
);

UserSchema.methods.verifyPassword = function(password:string)
    return bcrypt.compareSync(password, this.password);


const User = model<IUserDocument>('User', UserSchema);
export default User;

我的代码来源于此来源http://brianflove.com/2016/10/04/typescript-declaring-mongoose-schema-model/。

【问题讨论】:

【参考方案1】:

pre 是 generic method which parameter defaults to Document。如果不是这样,它应该是:

UserSchema.pre<IUserDocument>('save', function(next) ... );

【讨论】:

谢谢,这正是解决办法。

以上是关于使用猫鼬模型设置打字稿的主要内容,如果未能解决你的问题,请参考以下文章

使用打字稿创建猫鼬模型 - 子文档

打字稿模型添加猫鼬身份验证

如何在猫鼬(打字稿)中获取模型的_id

用打字稿中的子文档描述猫鼬模型

打字稿:猫鼬模式的静态方法

在打字稿中使用猫鼬填充查询