使用typescript的Mongoose模式/模型

Tar*_*ion 11 mongoose typescript

我使用这个声明:https://github.com/vagarenko/mongoose-typescript-definitions

以下代码工作正常但有2个问题:

import M = require('mongoose');

var userSchema:M.Schema = new M.Schema(
    {
        username: String,
        password: String,
        groups: Array
    }, { collection: 'user' });


export interface IUser extends M.Document {
    _id: string;
    username:string;
    password:string;
    groups:Array<string>;

    hasGroup(group:string);
}

userSchema.methods.hasGroup = function (group:string) {
    for (var i in this.groups) {
        if (this.groups[i] == group) {
            return true;
        }
    }
    return false;
};

export interface IUserModel extends M.Model<IUser> {
    findByName(name, cb);
}

// To be called as UserModel.findByName(...)
userSchema.statics.findByName = function (name, cb) {
    this.find({ name: new RegExp(name, 'i') }, cb);
}

export var UserModel = M.model<IUser>('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

问题1:较小的问题是,函数IUser.hasGroup不能在任何typescript类中声明,但至少它是typechecked.

问题2:更糟糕的是.我定义模型方法findByName和JS这将是有效的: UserModel.findByName(...)但我不能让他类型export var UserModelIUserModel.所以我无法对模型函数进行任何类型的检查.

wjo*_*sto 8

您应该能够说出如下内容:

export var UserModel = <IUserModel>M.model('user', userSchema);
Run Code Online (Sandbox Code Playgroud)

然后,当您引用UserModel时,您将拥有适当的类型检查/智能感知.

  • 我从未使用猫鼬的这些类型,我不确定它是否对你有某种要求.我一般坚持使用[DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped)的输入法.猫鼬定义可以在[这里](https://github.com/borisyankov/DefinitelyTyped/blob/master/mongoose/mongoose.d.ts)中找到,并且它的输入明显多于你链接的那些. (2认同)