类和接口来编写types化的模型和Mongoose在Typescript中使用明确的模式

我怎样才能使用types和接口来使用绝对的TypeScript来编写types化的模型和模式。

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
  2. 定义接口 (我称之为Document):这就是mongoose会与之交互的types
  3. 定义模型(我们将能够find,插入,更新…)

在代码中:

 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: '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 :) })