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の静的メソッドについて確認します。