まえおき
TypeScriptの世界に最近飛び込みました。まともにNode触った事無いので色々勉強中ですが、目下の所猛獣mongooseとの戦いが辛いので備忘録として書きます。
TypeScriptを勉強しながらなので、mongooseというかTypeScriptがムズイのかもしれません。
とりあえずユーザーモデル作る
d.ts読み込み等は省略してあります。
import mongoose = require('mongoose');
//スキーマ作る
var userSchema:mongoose.Schema = new mongoose.Schema({name:String, age:Number});
//モデル作る
var userModel:mongoose.Model<mongoose.Document> = mongoose.model('User', userSchema);
//モデルのインスタンス作る
var user:mongoose.Document = new userModel({name:'orzngo', age:17});
注意する点は、mongoose.Modelをnewした結果はTであるという事です。これがよくわかんなくてかなり悩みました。
ただし、このままだとDocument型がそのまま返ってくる形になる為、ぼくがuserSchemaで定義したnameとageが取れません。
Documentを拡張する
mongoose.Documentを継承したインターフェース、UserDocumentを定義しました。
interface UserDocument extends Document{
name:String;
age:Number;
}
これを参照出来るようにした上で、インポート等でコードを少し見やすくした物が以下になります。
import mongoose = require('mongoose');
import Schema = mongoose.Schema;
import Document = mongoose.Document;
import Model = mongoose.Model;
//スキーマ定義する
var userSchema:Schema = new Schema({name:String, age:Number});
//モデル作る
var userModel:Model<UserDocument> = <Model<UserDocument>>mongoose.model('User', userSchema);
//モデルからドキュメントを作る
var user:UserDocument = new userModel({name:'ORZNGO', age:17});
console.log(user.name);//ORZNGO
やっとこさコンパイルが通りました。interfaceが読めてれば、きちんと補完もしてくれます。
ひとまずできた
とりあえず独自モデルを定義する所までようやくこぎ着けました。1週間くらいかかったかもしれません。
初めてQiitaに記事を書いたのですが、これからも勉強の為にいろいろ書いていこうと思います。
追記1
mongooseをやっつけたと思ったら、sequelizeでも同じような事をしています。
http://qiita.com/orzngo/items/186d700de481cc23c055