afaayerhan afaayerhan - 4 months ago 21
Node.js Question

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

how can I use classes and interfaces to write typed Models and schemas in Typescript using definitelytyped .

import mongoose = require("mongoose");

//how can I use a class for the schema and model so I can new up
export interface IUser extends mongoose.Document {
name: String;

export class UserSchema{
name: String;

var userSchema = new mongoose.Schema({
name: String
export var User = mongoose.model<IUser>('user', userSchema);


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:

///<reference path="../../typings/tsd.d.ts"/>
import mongoose = require('mongoose')

// 1) CLASS
export class User {
  name: string
  mail: string

  constructor(data: {
    mail: string
    pass: string
  }) {
    this.mail = data.mail =

  /* any method would be defined here*/
  foo(): string {
     return // whatever

// no necessary to export the schema (keep it private)
var schema = new mongoose.Schema({
  mail: { required: true, type: String },
  name: { required: false, type: String}
// register each method

// 2) Document
export interface UserDocument extends User, mongoose.Document { }

// 3) MODEL
export var Users = mongoose.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: ''})
Users.create(myUser, (err: any, doc: UserDocument) => {
   if (err) { ... }
   console.log(doc._id) // id at DB
   console.log( // a // works :)