tutorial traductor online official nodejs language example convertir javascript node.js mongoose typescript

javascript - traductor - typescript official documentation



¿Mongoose la manera de Typescript...? (5)

Así es como lo hago:

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;

Intentando implementar un modelo Mongoose en Typescript. Scouring the Google ha revelado solo un enfoque híbrido (que combina JS y TS). ¿Cómo se podría implementar la clase User, en mi enfoque más bien ingenuo, sin JS?

Quiere poder IUserModel sin el equipaje.

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() {} }


Lo siento por necroposting, pero esto puede ser interesante para alguien. Creo que Typegoose proporciona una manera más moderna y elegante de definir modelos

Aquí hay un ejemplo de los documentos:

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


Otra alternativa si desea separar las definiciones de tipo y la implementación de la base de datos.

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 */ }));

Inspiración desde aquí: https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models


Si ha instalado @types/mongoose

npm install --save-dev @types/mongoose

Puedes hacerlo

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 */ }));

PD: copiada la respuesta de @Hongbo Miao


Solo agrega otra forma:

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, // ... }));

Y la diferencia entre interface y type , lea esta respuesta

De esta manera tiene una ventaja, puede agregar tipizaciones de métodos estáticos de Mongoose:

interface IUserModel extends IUser, mongoose.Document { generateJwt: () => string }