TypeScript 支持

Mongoose 推出了 v5.11.0 中正式支持 TypeScript 绑定。 Mongoose 的 index.d.ts 文件支持多种语法,并尽可能与 @types/mongoose 兼容。 本指南描述了 Mongoose 在 TypeScript 中使用 Mongoose 的推荐方法。

创建你的第一个文档

要开始在 TypeScript 中使用 Mongoose,你需要:

  1. 创建一个代表 MongoDB 中文档的接口。
  2. 创建一个 结构 对应的文档接口。
  3. 创建一个模型。
  4. 连接到 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: 'bill@initech.com',
    avatar: 'https://i.imgur.com/dM7Thhn.png'
  });
  await user.save();

  console.log(user.email); // 'bill@initech.com'
}

作为开发者,你有责任确保你的文档界面与你的 Mongoose 结构保持一致。 例如,如果 email 在你的 Mongoose 结构中是 required,但在你的文档界面中是可选的,Mongoose 不会报告错误。

User() 构造函数返回 HydratedDocument<IUser> 的实例。 IUser 是一个文档接口,它代表了 MongoDB 中 IUser 对象的原始对象结构。 HydratedDocument<IUser> 代表一个水合 Mongoose 文档,包含方法、虚拟和其他 Mongoose 特定的功能。

import { HydratedDocument } from 'mongoose';

const user: HydratedDocument<IUser> = new User({
  name: 'Bill',
  email: 'bill@initech.com',
  avatar: 'https://i.imgur.com/dM7Thhn.png'
});

ObjectId 和其他 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 的类not 类,用于创建新的 MongoDB ObjectId。

使用自定义绑定

如果 Mongoose 的内置 index.d.ts 文件不适合你,你可以在 package.json 的安装后脚本中将其删除,如下所示。 不过,在此之前,请 在 Mongoose 的 GitHub 页面上打开一个问题 并描述你遇到的问题。

{
  "postinstall": "rm ./node_modules/mongoose/index.d.ts"
}

下一步

现在你已经了解了如何在 TypeScript 中使用 Mongoose 的基础知识,让我们来看看 TypeScript 中的静态