元になるクラスの宣言
まず、Mixin をする 2 つのクラス ClassA, ClassB を作成する。
更に、継承元の BaseClass を作成する。
prepare.ts
class ClassA {
methodA() { console.log('method A'); }
}
class ClassB {
methodB() { console.log('method B'); }
}
class BaseClass {
member="member"
}
Mixin の定義
はじめに、コンストラクタ型を一般的に定義しておく。
次に、作成したいクラス MixinAB のコンストラクタを function として定義する。
このとき、 methodA, methodB の実装は ClassA と ClassB に委譲する。
このままだと、常に new MixinAB(BaseClass) として呼び出す必要があり、MixinAB の利用先から BaseClass への非本質的な依存関係が生じる。
これを防ぐために、MixinAB を継承する形で MergedClass を定義する。
Mixn.ts
type Constructor<T = {}> = new (...args: any[]) => T;
function MixinAB<B extends Constructor>(Base: B) {
return class extends Base {
methodA = new ClassA().methodA;
methodB = new ClassB().methodB;
};
}
class MergedClass extends MixinAB(BaseClass) {}
Mixin の使用
use.ts
const merged = new MergedClass();
merged.methodA(); // method A
merged.methodB(); // method B
console.log(merged.member); // member