TypeScript 支持
Mongoose 在 v5.11.0 版本中引入了 官方支持的 TypeScript 绑定。Mongoose 的 index.d.ts
文件支持多种语法,并努力与 @types/mongoose
兼容(尽可能地)。本指南介绍了 Mongoose 在 TypeScript 中的推荐方法。
创建您的第一个文档
要开始在 TypeScript 中使用 Mongoose,您需要
- 创建一个表示 MongoDB 中文档的接口。
- 创建一个与文档接口相对应的 模式。
- 创建一个模型。
- 连接到 MongoDB.
import { Schema, model, connect } from 'mongoose';
// 1. Create an interface representing a document in MongoDB.
interface IUser {
name: string;
email: string;
avatar?: string;
}
// 2. Create a Schema corresponding to the document interface.
const userSchema = new Schema<IUser>({
name: { type: String, required: true },
email: { type: String, required: true },
avatar: String
});
// 3. Create a Model.
const User = model<IUser>('User', userSchema);
run().catch(err => console.log(err));
async function run() {
// 4. Connect to MongoDB
await connect('mongodb://127.0.0.1:27017/test');
const user = new User({
name: 'Bill',
email: '[email protected]',
avatar: 'https://i.imgur.com/dM7Thhn.png'
});
await user.save();
console.log(user.email); // '[email protected]'
}
您作为开发人员负责确保您的文档接口与您的 Mongoose 模式一致。例如,如果您的 Mongoose 模式中 email
是 required
,而您的文档接口中是可选的,Mongoose 不会报告错误。
User()
构造函数返回 HydratedDocument<IUser>
的实例。IUser
是一个文档接口,它表示 IUser
对象在 MongoDB 中的原始对象结构。HydratedDocument<IUser>
表示一个已水化的 Mongoose 文档,具有方法、虚拟属性和其他 Mongoose 特定的功能。
import { HydratedDocument } from 'mongoose';
const user: HydratedDocument<IUser> = new User({
name: 'Bill',
email: '[email protected]',
avatar: 'https://i.imgur.com/dM7Thhn.png'
});
ObjectIds 和其他 Mongoose 类型
要定义类型为 ObjectId
的属性,您应该在 TypeScript 文档接口中使用 Types.ObjectId
。您应该在模式定义中使用 'ObjectId'
或 Schema.Types.ObjectId
。
import { Schema, Types } from 'mongoose';
// 1. Create an interface representing a document in MongoDB.
interface IUser {
name: string;
email: string;
// Use `Types.ObjectId` in document interface...
organization: Types.ObjectId;
}
// 2. Create a Schema corresponding to the document interface.
const userSchema = new Schema<IUser>({
name: { type: String, required: true },
email: { type: String, required: true },
// And `Schema.Types.ObjectId` in the schema definition.
organization: { type: Schema.Types.ObjectId, ref: 'Organization' }
});
这是因为 Schema.Types.ObjectId
是一个 继承自 SchemaType 的类,而不是您用来创建新 MongoDB ObjectId 的类。
使用自定义绑定
如果 Mongoose 内置的 index.d.ts
文件不适合您,您可以在 package.json
中的 postinstall 脚本中将其删除,如下所示。但是,在您这样做之前,请 在 Mongoose 的 GitHub 页面上打开一个问题 并描述您遇到的问题。
{
"postinstall": "rm ./node_modules/mongoose/index.d.ts"
}
下一步
现在您已经了解了在 TypeScript 中使用 Mongoose 的基本知识,让我们看一下 TypeScript 中的静态方法。