classes and interfaces to write typed Models and schemas of Mongoose in Typescript using definitelytyped classes and interfaces to write typed Models and schemas of Mongoose in Typescript using definitelytyped mongodb mongodb

classes and interfaces to write typed Models and schemas of Mongoose in Typescript using definitelytyped


This is how I do this:

  1. Define TypeScript class which will define our logic.
  2. Define the interface (which I name Document): that's the type mongoose will interact with
  3. 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 :)})