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() {}
}
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;
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
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
}
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);
})();
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 Miao
réponse