Skip to content

Mixins ​

KosameではMixin機構自体の独自実装はしておらず、素のTypeScriptのMixin関数パターンを使用し実現します。

Mixinsの仕組み ​

TypeScriptのMixin ​

Kosame独自のmixin機構自体は独自実装されておらず、TypeScriptのMixinパターンがそのまま使うことができます。

ts
function WithTimestamp<TBase extends Constructor<Model>>(Base: TBase) {
  abstract class WithTimestampMixin extends Base {
    get createdAtLabel() {
      return "作成日時";
    }
  }
  return WithTimestampMixin;
}

Constructor<T> ​

通常のmixinパターンの型はnew (...args) => Tですが、Model自体がabstract classのためこの型では噛み合いません。なのでKosameではConstructor<T>(abstract new (...args: any[]) => T)という専用の型を提供することでこの問題を解決しています。

SoftDeletable ​

SoftDeletableはDBから完全削除をするのではなくdeletedAtのようなカラムに日時を入れ、削除したかのように見せる機能です。

適用方法 ​

テーブルにdeletedAtColumn()でdeletedAtカラムを定義し、SoftDeletable(Model)でModelに適用します。deletedAtColumn()はdialectごとにkosame/pgなどからimportします。

ts
import { Model, SoftDeletable } from "kosame";
import { deletedAtColumn } from "kosame/pg";

export const usersTable = pgTable("users", {
  id: serial("id").primaryKey(),
  name: text("name").notNull(),
  deletedAt: deletedAtColumn(),
});

class User extends SoftDeletable(Model) {
  static table = usersTable;
}

delete()とhardDelete() ​

delete()は実際には削除せずdeletedAtに日時をUPDATEします。本来の完全削除をしたい場合はhardDelete()を使います。

取得時の自動除外 ​

SoftDeletableを適用したModelは、find()とincludeによるリレーション取得の両方で、削除済みの行が自動的に除外されます。カラム名がdeletedAtというだけでは除外されず、SoftDeletableを適用した場合のみ有効です。