Mongoose-schema/modell med TypeScript


Jag använder dessa deklarationer: https://github.com/vagarenko/mongoose-typescript-definitions

Följande kod fungerar bra men har 2 problem:

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);

Problem 1: Det mindre problemet är att funktionen IUser.hasGroup inte kan deklareras inuti någon TypeScript-klass, ... men åtminstone är den typkontrollerad.

Problem 2: Är ännu värre. Jag definierar modellmetoden findByName och i js skulle detta vara giltigt: UserModel.findByName(...) men jag kan inte få typen av export var UserModel till IUserModel. Så jag kan inte få någon typkontroll på modellfunktionerna.

Svar #1

Du borde kunna säga något liknande följande:

export var UserModel = <IUserModel>M.model('user', userSchema);

Då kommer du att ha korrekt typkontroll/intellisense när du refererar till UserModel.

Relaterade artiklar