Typegoose 用于 TypeScript:完整指南
\n\nTypegoose 是一个强大的 Mongoose 封装库,允许您使用 TypeScript 的类和装饰器来定义 MongoDB 模型。它解决了 Node.js 开发中的一个关键问题:TypeScript 的严格类型检查与 Mongoose 动态特性之间的不匹配。无需手动重复定义类型和模式,Typegoose 让您只需一次性地将模型描述为 TypeScript 类,并自动从中生成 Mongoose 模式。
\n\n为什么需要它?首先,它显著减少了样板代码的数量。您不再需要编写单独的接口和单独的模式——TypeScript 类同时承担了这两项功能。其次,Typegoose 在从文档创建到执行查询的所有阶段都提供了完整的类型安全。IDE 将提示字段、方法及其类型,这几乎消除了因字段名称拼写错误或数据类型不正确而导致的错误。第三,该库支持 Mongoose 的所有功能:虚拟字段、钩子(pre/post)、索引、populate 和中间件。
\n\nTypegoose 非常适合大型项目,这些项目中代码的可维护性至关重要,也适合希望充分利用 TypeScript 中面向对象编程优势的团队。它可以轻松集成到 NestJS、Express 和其他框架中,提供统一的数据描述标准。
\n\n安装
\n\n要安装 Typegoose 及其依赖项,请在终端中执行以下命令:
\n\nnpm install @typegoose/typegoose mongoose\nnpm install -D @types/mongoose\n\n如果您使用 yarn:
\n\nyarn add @typegoose/typegoose mongoose\nyarn add -D @types/mongoose\n\nTypegoose 需要 TypeScript 4.0 或更高版本。请确保您的 tsconfig.json 中启用了以下选项:
{\n "compilerOptions": {\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true,\n "target": "ES2020",\n "module": "commonjs"\n }\n}\n\n快速入门
\n\n让我们创建一个简单的用户模型并将其保存到 MongoDB。
\n\nimport { prop, getModelForClass } from '@typegoose/typegoose';\nimport mongoose from 'mongoose';\n\n// 1. 定义模型类\nclass User {\n @prop({ required: true })\n public name!: string;\n\n @prop({ required: true, unique: true })\n public email!: string;\n\n @prop({ default: 0 })\n public age!: number;\n}\n\n// 2. 获取 Mongoose 模型\nconst UserModel = getModelForClass(User);\n\n// 3. 连接数据库并操作\nasync function main() {\n await mongoose.connect('mongodb://localhost:27017/test');\n\n // 创建用户\n const user = await UserModel.create({\n name: 'Alice',\n email: 'alice@example.com',\n age: 30,\n });\n\n console.log('Created:', user);\n\n // 查找用户\n const found = await UserModel.findOne({ email: 'alice@example.com' });\n console.log('Found:', found);\n}\n\nmain().catch(console.error);\n\n这个最小的示例展示了核心思想:带有 @prop 装饰器的 User 类描述了模式,而 getModelForClass 函数则创建了一个立即可用的 Mongoose 模型。
主要方法和函数
\n\n1. @prop() — 属性装饰器
\n签名: @prop(options?: PropOptions)
描述: 在 Mongoose 模式中定义一个字段。它接受一个选项对象,类似于 Mongoose 中的字段选项(required, default, unique, ref, enum 等)。
\n\nimport { prop } from '@typegoose/typegoose';\n\nclass Product {\n @prop({ required: true, type: String })\n public title!: string;\n\n @prop({ default: 0, min: 0 })\n public price!: number;\n\n @prop({ enum: ['a