sequelizeを使う時はcliでマイグレーションすることが多いと思いますが、出力されるファイルはjsです。イケてないですね(諸説)
sequelize-cli-typescript という素晴らしいモジュールもありますが、最終更新が2年前なので惜しいです。
とりあえず model を作成する
npx sequelize-cli init
こうなる
|- models
|- migrations
|- seeders
|- config
npx sequelize-cli model:generate --name member --attributes name:string --underscored
id, name を持つ member モデルが作成されます。ついでにindex.jsも。
'use strict';
module.exports = (sequelize, DataTypes) => {
const member = sequelize.define('member', {
name: DataTypes.STRING
}, {
underscored: true,
});
member.associate = function(models) {
// associations can be defined here
};
return member;
};
オプション
- underscored: 自動生成の
created_at・updated_atがスネークケースになります。
型定義をつける
公式documentの typescript を読むと、
- class
- .define
のどちらかを使う必要がありそうです。生成されたものが define なので、それに合わせた型定義ファイルを作成します。
階層
models
|- index.js
|- member.js
|- index.d.ts <-作成
import { Model, BuildOptions } from 'sequelize';
/* モデルの数作成する */
interface MemberModel extends Model {
readonly id: number;
name: string;
readonly created_at: date;
readonly updated_at: date;
}
type MemberModelStatic = typeof Model & {
new (values?: object, options?: BuildOptions): MemberModel;
}
/* --------------- */
interface DBModel {
member: MemberModelStatic;
}
declare const db: DBModel;
export = db;
こうすることで、index.js で module.exports されている db に型定義がつきます。
※ DBModel のキーはモデル名と同一にする必要があります。
使う
find や create などの補完が出てくれます。
ただし、find 系の返り値が any になります。(死)
嫌な人は class の書き方か、typeorm を使おう。
