classes and interfaces to write typed Models and schemas of Mongoose in Typescript using definitelytyped
This is how I do this:
- Define TypeScript class which will define our logic.
- Define the interface (which I name Document): that's the type
mongoose
will interact with - Define the model (we'll be able to find, insert, update...)
In code:
import { Document, Schema, model } from 'mongoose'// 1) CLASSexport class User { name: string mail: string constructor(data: { mail: string name: string }) { this.mail = data.mail this.name = data.name } /* any method would be defined here*/ foo(): string { return this.name.toUpperCase() // whatever }}// no necessary to export the schema (keep it private to the module)var schema = new Schema({ mail: { required: true, type: String }, name: { required: false, type: String }})// register each method at schemaschema.method('foo', User.prototype.foo)// 2) Documentexport interface UserDocument extends User, Document { }// 3) MODELexport const Users = model<UserDocument>('User', schema)
How would I use this? let's imagine that code is stored in user.ts
, now you'd be able to do the following:
import { User, UserDocument, Users } from 'user'let myUser = new User({ name: 'a', mail: 'aaa@aaa.com' })Users.create(myUser, (err: any, doc: UserDocument) => { if (err) { ... } console.log(doc._id) // id at DB console.log(doc.name) // a doc.foo() // works :)})