TypeScriptサポート

Mongooseはv5.11.0でTypeScriptバインディングを公式サポートしました。Mongooseのindex.d.tsファイルはさまざまな構文をサポートしており、可能な限り@types/mongooseとの互換性を目指しています。このガイドでは、MongooseでTypeScriptを使用するためのMongoose推奨の手法について説明します。

最初のドキュメントの作成

MongooseでTypeScriptを使用する場合、次の手順に従う必要があります。

  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はエラーを表示しません。つまり、開発者としてドキュメントインターフェースが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'
});

オブジェクトIDとその他の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.ObjectIdSchemaTypeを継承するクラスであり、新しいMongoDBのObjectIdを作成するために使用するクラスではないためです。

カスタムバインディングの使用

Mongooseの組み込みindex.d.tsファイルが機能しない場合は、次のようにpackage.jsonのpostinstallスクリプトで削除できます。ただし、その前にMongooseのGitHubページで問題を開いて、発生した問題について説明してください。

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

次へ

MongooseでTypeScriptを使用する方法の基本を学習したところで、TypeScriptの静的メソッドについて確認します。