TypeScriptサポート
Mongooseはv5.11.0でTypeScriptバインディングを公式サポートしました。Mongooseのindex.d.tsファイルはさまざまな構文をサポートしており、可能な限り@types/mongooseとの互換性を目指しています。このガイドでは、MongooseでTypeScriptを使用するためのMongoose推奨の手法について説明します。
最初のドキュメントの作成
MongooseでTypeScriptを使用する場合、次の手順に従う必要があります。
- 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: '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.ObjectIdがSchemaTypeを継承するクラスであり、新しいMongoDBのObjectIdを作成するために使用するクラスではないためです。
カスタムバインディングの使用
Mongooseの組み込みindex.d.tsファイルが機能しない場合は、次のようにpackage.jsonのpostinstallスクリプトで削除できます。ただし、その前にMongooseのGitHubページで問題を開いて、発生した問題について説明してください。
{
"postinstall": "rm ./node_modules/mongoose/index.d.ts"
}次へ
MongooseでTypeScriptを使用する方法の基本を学習したところで、TypeScriptの静的メソッドについて確認します。

