クラス

Mixin

このエントリーをはてなブックマークに追加
最終更新日 2016-12-31

TypeScript のクラスは extends による多重継承をサポートしませんが、Mixin を利用すると、複数のクラスから実装を取り込むことができます。 次に示すのは、Mixin クラスを使用する例です。

class Mixin1 {
    public mix1(): string {
        return "Hello, Mixin1";
    }
}

class Mixin2 {
    public mix2(): string {
        return "Hello, Mixin2";
    }
}

class Foo implements Mixin1, Mixin2 {
    mix1: () => string;  // Mixin1 のメンバ
    mix2: () => string;  // Mixin2 のメンバ
}

Foo.prototype["mix1"] = Mixin1.prototype["mix1"];  // Mixin1 のメンバの実装をバインディング
Foo.prototype["mix2"] = Mixin2.prototype["mix2"];  // Mixin2 のメンバの実装をバインディング

var foo: Foo = new Foo;
var result1: string = foo.mix1();  // "Hello, Mixin1"
var result2: string = foo.mix2();  // "Hello, Mixin2"

Mixin1 と Mixin2 が Mixin クラスです。 クラス Foo は、キーワード implements によって Mixin1 と Mixin2 を Mixin クラスとして使用することを宣言します。 さらに Foo では、Mixin1 と Mixin2 のメンバを宣言する必要があります。

ところで、クラス Foo の宣言時には、まだ Mixin クラスの実装は取り込まれていません。 そのため、クラス宣言後に Mixin クラスのメンバをバインディングします。 この時、当然コンパイラはバインディング対象の型チェックを行います。

このように、通常の継承ではクラス宣言時に単一の基底クラスの実装を取り込むのに対し、 Mixin ではクラス宣言の後に複数の Mixin クラスの実装を取り込みます。