TypeScript 支持

Mongoose 在 v5.11.0 版本中引入了 官方支持的 TypeScript 绑定。Mongoose 的 index.d.ts 文件支持多种语法,并努力与 @types/mongoose 兼容(尽可能地)。本指南介绍了 Mongoose 在 TypeScript 中的推荐方法。

创建您的第一个文档

要开始在 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: '[email protected]',
    avatar: 'https://i.imgur.com/dM7Thhn.png'
  });
  await user.save();

  console.log(user.email); // '[email protected]'
}

您作为开发人员负责确保您的文档接口与您的 Mongoose 模式一致。例如,如果您的 Mongoose 模式中 emailrequired,而您的文档接口中是可选的,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 中的静态方法