【问题标题】:classes and interfaces to write typed Models and schemas of Mongoose in Typescript using definitelytyped使用绝对类型在 Typescript 中编写 Mongoose 的类型化模型和模式的类和接口
【发布时间】:2015-04-07 10:08:47
【问题描述】:

如何使用类和接口在 Typescript 中使用肯定类型编写类型化模型和模式。

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

【问题讨论】:

    标签: node.js mongodb mongoose typescript passport.js


    【解决方案1】:

    我就是这样做的:

    1. 定义 TypeScript class,它将定义我们的逻辑。
    2. 定义接口(我将其命名为 Document):这是mongoose 将与之交互的类型
    3. 定义模型(我们将能够查找、插入、更新...)

    在代码中:

    import { Document, Schema, model } from 'mongoose'
    
    // 1) CLASS
    export 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 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 :)
    })
    

    【讨论】:

    • 你如何处理id?我认为它应该是 User 类的一部分,但你不能从mongoose.Document继承
    • 是的,我看到人们在做 IUser、IUserModel 和各种疯狂的行为。这是一种定义非常明确的方式。
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 2021-07-31
    • 2019-01-13
    • 2020-06-16
    • 2014-05-21
    • 2016-09-13
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多