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, // ... }));
和interface
和type
的区别,请阅读这个答案
这种方式有一个好处,你可以添加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
的回答