[typescript]インタフェース定義まとめ


ES6の仕様には無いですがTypeScriptで使用できるインタフェースについてまとめます。
javaのインタフェースと取り扱いはほぼ同じなのでjava使いの人は比較的習得が容易かと。
javaで
List<String> hoge=new ArrayList<>();
と書くように、インタフェース型の変数で具象クラスのインスタンスを受ける点も同じ。
うまく使用することで文字通り「コード間の境界」を明確にし、メンテナンス性を向上させることができます。

//インタフェースの取り扱いについてまとめる

interface MyInterfaceParent {
    awesome1():string;
}

/**
 * MyInterfaceParentを継承する。
 * これを実装するクラスは、親インタフェースのawesome1()メソッドも実装しなくてはならない
 */
interface MyInterfaceChild extends MyInterfaceParent {
    awesome2():string;
}

interface MyInterface2 {
    awesome3():number;
}

/**
 * MyInterfaceChildを実装するので、親インタフェースのawesome1()メソッドも実装しなくてはならない
 */
class MyConcrete implements MyInterfaceChild {
    awesome1():string {
        return "hoge";
    }

    awesome2():string {
        return "fuga";
    }
}

/**
 * インタフェースは複数実装することができる
 * 複数実装した場合、すべてのインタフェースメソッドの実装をしなければならない
 * この例では、MyInterfaceParentが実装を要求するawesome1()メソッドと、
 * MyInterface2が実装を要求するawesome3()を実装しなければならない。
  */
class MyConcrete2 implements MyInterfaceParent,MyInterface2 {
    awesome1():string {
        return "foo";
    }

    awesome3():number {
        return 42;
    }

}

/**
 * 変数の型をインタフェース型にすることで変更に強くなる
 * javaのMap<String,Object> map=new HashMap<>();
 * と構文的にも意味的にもよく似ている
 */
var myInstance:MyInterfaceChild = new MyConcrete();
console.log(myInstance.awesome1());
console.log(myInstance.awesome2());

/**
 * 多重インタフェース実装したインスタンスのうち、MyInterface2型で受ける
 * この場合、MyInterfaceParentで実装されるメソッドは呼べない。
 */
var myInstance2:MyInterface2 = new MyConcrete2();
console.log(myInstance2.awesome3()); //myInstance2.awesome1()はコンパイルエラー。