Классы и интерфейсы для написания типизированных моделей и схем Mongoose в Typescript с использованием определенно определенных

как я могу использовать классы и интерфейсы для написания типизированных моделей и схем в Typescript с использованием defintyped.

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

Ответ 1

Вот как я это делаю:

  • Определите TypeScript класс, который определит нашу логику.
  • Определите интерфейс (который я называю Document): тип mongoose будет взаимодействовать с
  • Определите модель (мы сможем найти, вставить, обновить...)

В коде:

import { Document, Schema, model } from 'mongoose'

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

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

  /* any method would be defined here*/
  foo(): string {
     return this.name.uppercase() // 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 schema
schema.method('foo', User.prototype.foo)

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

// 3) MODEL
export const Users = model<UserDocument>('User', schema)

Как я буду использовать это? предположим, что код хранится в user.ts, теперь вы сможете сделать следующее:

import { User, UserDocument, Users } from 'user'

let myUser = new User({ name: 'a', mail: '[email protected]' })
Users.create(myUser, (err: any, doc: UserDocument) => {
   if (err) { ... }
   console.log(doc._id) // id at DB
   console.log(doc.name) // a
   doc.foo() // works :)
})