Mongoose を TypeScript で使う
Mongoose は Node.js で MongoDB を操作するための強力な Object Data Modeling (ODM) ツールです。TypeScript と組み合わせることで、より強力で安全なコードを書くことができます。
基本的な手順
-
TypeScript インターフェースの定義
まず、MongoDB ドキュメントの構造を定義する TypeScript インターフェースを作成します。interface User { name: string; age: number; email: string; }
-
Mongoose スキーマの作成
次に、Mongoose スキーマを作成します。スキーマは、MongoDB ドキュメントの構造を定義し、Mongoose にどのようにデータを処理するかを指示します。import mongoose from 'mongoose'; const userSchema = new mongoose.Schema<User>({ name: { type: String, required: true }, age: { type: Number, required: true }, email: { type: String, required: true, unique: true } }); const User = mongoose.model <User>('User', userSchema);
-
モデルの使用
作成したモデルを使用して、MongoDB との操作を行います。// ユーザーの保存 const newUser = new User({ name: 'Alice', age: 30, email: '[email protected]' }); newUser.save() .then(() => console.log('User saved successfully')) .catch(err => console.error(err)); // ユーザーの検索 User.find({ age: { $gt: 25 } }) .then(users => console.log(users)) .catch(err => console.error(err));
TypeScript の利点
- IDE のサポート
IDE の強力なコード補完とヒント機能を利用できます。 - コードの可読性
型情報により、コードがより読みやすく理解しやすくなります。 - 静的型付け
コンパイル時に型エラーを検出できるため、バグを早期に発見できます。
インターフェースとスキーマの定義
- スキーマ
Mongoose スキーマを作成し、インターフェースを型情報として使用します。
interface User {
name: string;
age: number;
email: string;
}
const userSchema = new mongoose.Schema<User>({
name: { type: String, required: true },
age: { type: Number, required: true },
email: { type: String, required: true, unique: true }
});
const User = mongoose.model <User>('User', userSchema);
型推論の活用
- TypeScript の型推論
TypeScript は変数の型をコンテキストから推論します。 - Mongoose の型推論
Mongoose はスキーマ定義から型を推論することができます。
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
age: { type: Number, required: true },
email: { type: String, required: t rue, unique: true }
});
const User = mongoose.model ('User', userSchema);
// TypeScript は User モデルの型を推論します
const user: User = new User({
name: 'Alice',
age: 30,
email: '[email protected]'
});
ジェネリック型とカスタムフック
- カスタムフック
Mongoose のフック機能を使用して、データの検証や変換を行うことができます。 - ジェネリック型
Mongoose スキーマにジェネリック型を使用することで、より柔軟なモデル定義が可能になります。
interface UserDoc extends Document {
name: string;
age: number;
email: string;
}
const userSchema = new mongoose.Schema<UserDoc>({
name: { type: String, required: true },
age: { type: Number, required: true },
email: { type: String, required: true, unique: true }
});
userSchema.pre('save', function(next) {
// データの検証や変換処理
next();
});
const User = mongoose.model<UserDoc>('User', userSchema);
node.js typescript mongoose