mongoose的打字方式…?

试图在Typescript中实现一个Mongoose模型。 谷歌search只显示了混合的方法(结合JS和TS)。 如果没有JS,我会怎么去实现User类呢?

希望能够没有行李的IUserModel。

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

以下是我如何做到的:

 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; 

另一种select,如果你想分离你的types定义和数据库实现。

 import {IUser} from './user.ts'; import * as mongoose from 'mongoose'; type UserType = IUser & mongoose.Document; const User = mongoose.model<UserType>('User', new mongoose.Schema({ userName : String, password : String, /* etc */ })); 

从这里启发: https : //github.com/Appsilon/styleguide/wiki/mongoose-typescript-models

只需添加另一种方式:

 import { IUser } from './user.ts'; import * as mongoose from 'mongoose'; interface IUserModel extends IUser, mongoose.Document {} const User = mongoose.model<IUserModel>('User', new mongoose.Schema({ userName: String, password: String, // ... })); 

interfacetype的区别,请阅读这个答案

这种方式有一个好处,你可以添加Mongoose静态方法types:

 interface IUserModel extends IUser, mongoose.Document { generateJwt: () => string } 

对不起,我们可能对某人感兴趣。 我认为Typegoose提供了更现代和优雅的方式来定义模型

以下是文档中的一个示例:

 import { prop, Typegoose, ModelType, InstanceType } from 'typegoose'; import * as mongoose from 'mongoose'; mongoose.connect('mongodb://localhost:27017/test'); class User extends Typegoose { @prop() name?: string; } const UserModel = new User().getModelForClass(User); // UserModel is a regular Mongoose Model with correct types (async () => { const u = new UserModel({ name: 'JohnDoe' }); await u.save(); const user = await UserModel.findOne(); // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 } console.log(user); })(); 

如果你已经安装了@types/mongoose

 npm install --save-dev @types/mongoose 

你可以这样做

 import {IUser} from './user.ts'; import { Document, Schema, model} from 'mongoose'; type UserType = IUser & mongoose.Document; const User = mongoose.model<UserType>('User', new mongoose.Schema({ userName : String, password : String, /* etc */ })); 

PS:抄了@Hongbo Miao的回答