Mongoose the Typescript way…?

Trying to implement a Mongoose model in Typescript. Scouring the Google has revealed only a hybrid approach (combining JS and TS). How would one go about implementing the User class, on my rather naive approach, without the JS?

Want to be able to IUserModel without the baggage.

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


Here’s how I do it:

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;

Leave a Reply

Your email address will not be published. Required fields are marked *