La mangouste le Tapuscrit de la sorte...?

J'essaie d'implémenter un modèle Mangoose à la typographie. Scrouring the Google a révélé seulement une approche hybride (combinant JS et TS). Comment mettre en place la classe des utilisateurs, selon mon approche plutôt naïve, sans le JS?

Je veux pouvoir IUserModel sans les bagages.

import {IUser} from './user.ts';
import {Document, Schema, Model} from 'mongoose';

// mixing in a couple of interfaces
interface IUserDocument extends IUser,  Document {}

// mongoose, why oh why '[String]' 
// TODO: investigate out why mongoose needs its own data types
let userSchema: Schema = new Schema({
  userName  : String,
  password  : String,
  firstName : String,
  lastName  : String,
  email     : String,
  activated : Boolean,
  roles     : [String]
});

// interface we want to code to?
export interface IUserModel extends Model<IUserDocument> {/* any custom methods here */}

// stumped here
export class User {
  constructor() {}
}
35
demandé sur Tim McNamara 2015-12-27 18:59:26

5 réponses

Voici comment je le fais:

export interface IUser extends mongoose.Document {
  name: string; 
  somethingElse?: number; 
};

export const UserSchema = new mongoose.Schema({
  name: {type:String, required: true},
  somethingElse: Number,
});

const User = mongoose.model<IUser>('User', UserSchema);
export default User;
56
répondu Louay Alakkad 2017-02-01 18:30:38

une autre alternative si vous voulez détacher vos définitions de type et l'implémentation de la base de données.

import {IUser} from './user.ts';
import * as mongoose from 'mongoose';

type UserType = IUser & mongoose.Document;
const User = mongoose.model<UserType>('User', new mongoose.Schema({
    userName  : String,
    password  : String,
    /* etc */
}));

l'Inspiration à partir d'ici: https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models

19
répondu Gábor Imre 2016-04-16 08:35:33

il suffit d'ajouter une autre façon:

import { IUser } from './user.ts';
import * as mongoose from 'mongoose';

interface IUserModel extends IUser, mongoose.Document {}

const User = mongoose.model<IUserModel>('User', new mongoose.Schema({
    userName: String,
    password: String,
    // ...
}));

Et la différence entre interface et type, merci de lire cette réponse

de Cette façon a un avantage, vous pouvez ajouter de la Mangouste méthode statique typings:

interface IUserModel extends IUser, mongoose.Document {
  generateJwt: () => string
}
4
répondu Hongbo Miao 2017-05-23 11:47:22

désolé pour le nécroposage mais cela peut être intéressant pour quelqu'un. Je pense Typegoose fournit une façon plus moderne et élégante de définir les modèles

voici un exemple tiré du docs:

import { prop, Typegoose, ModelType, InstanceType } from 'typegoose';
import * as mongoose from 'mongoose';

mongoose.connect('mongodb://localhost:27017/test');

class User extends Typegoose {
    @prop()
    name?: string;
}

const UserModel = new User().getModelForClass(User);

// UserModel is a regular Mongoose Model with correct types
(async () => {
    const u = new UserModel({ name: 'JohnDoe' });
    await u.save();
    const user = await UserModel.findOne();

    // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }
    console.log(user);
})();
3
répondu Dimanoid 2017-10-15 10:31:41

Si vous avez installé @types/mongoose

npm install --save-dev @types/mongoose

Vous pouvez donc faire

import {IUser} from './user.ts';
import { Document, Schema, model} from 'mongoose';

type UserType = IUser & Document;
const User = model<UserType>('User', new Schema({
    userName  : String,
    password  : String,
    /* etc */
}));

PS: copié @Hongbo Miaoréponse

2
répondu AdityaParab 2018-05-22 07:08:52