オブジェクト型

構造的サブタイピング

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

オブジェクト型は、たとえ継承関係やインターフェイスの実装が無くても、 メンバを満たしていれば構造的に互換性があるとみなされます。これは構造的サブタイピングやダックタイピングと呼ばれます。 次に示すのは、構造的サブタイピングの例です。

interface Foo {
    x: string;
    y(): void;
}

class Bar {
    public x: string;
    public y(): void {
          
    }
    public z(): void {
          
    }
}

var result: Foo = new Bar;

クラス Bar はインターフェイス Foo を実装しているわけではありませんが、Foo と同じメンバ x と y() を持つため、 Foo 型の変数にインスタンスを代入することができます。 また、Foo のメンバを満たしていれば、Bar が余計なメンバ(この例では z() )を含んでいてもコンパイルエラーにはなりません。

同様に、メンバを満たすオブジェクトリテラルも代入できます。

interface Foo {
    x: string;
    y(): void;
}

var result: Foo = { x: "TypeScript", y: function(){}, z: 123 };

ただし、プライベートメンバを含む場合は互換性がありません。 次の例では、クラス Foo とクラス Bar は同じメンバを持ちますが、 メンバ変数 x は private なのでコンパイルエラーとなります。

class Foo {
    private x: string;
    public y(): void {
          
    }
}

class Bar {
    private x: string;
    public y(): void {
          
    }
}

// コンパイルエラー
var result: Foo = new Bar;