[typescript]クラス定義


typescriptでのクラス定義についてまとめてみた
大体java書いたことある人なら見たことある構文で構成されてると思います。

javascriptのprototype継承方式になれていた場合、結構書き方変わるので最初はつらいかもしれません。
ちなみに、インタフェースと違い、クラス構文はES6でも採用されています。

class Foo {
    /**
     * コンストラクタの定義はconstructorメソッドで定義する。
     * 引数にpublic修飾子をつけることで、メンバ変数として定義できる
     * (this.str=str;this.num=num;と同じ)
     * @param str
     * @param num
     */
    constructor(public str:string, public num:number) {
    };
}

class Bar extends Foo {

    //static変数も定義できる
    public static hello:string = "Hello,ClassDefinition!";
    //メンバ変数と同名にしても一応コンパイルエラーは起こらない
    //(メンテナンス性を考えると到底推奨できない書き方だろうけど)
    public static str:string = "This is static property";

    constructor(public str:string, public num:number) {
        super(str, num); //スーパークラスのコンストラクタの呼び出し
    }

    /**
     * 戻りの型を定義できる。
     * この例ではvoid(何も返さない)とする
     */
    print():void {
        console.log("str is " + this.str + ",num is " + this.num);
    }

    absNum():number {
        return this.num > 0 ? this.num : -this.num;
    }

}

/**
 * 変数の型指定は以下のような記述もできる。
 * この場合、void型のprintメソッドを持つインスタンスを代入できる。
 */
var bar:{print():void} = new Bar("Hello", 42);
bar.print(); //bar.absNumはこの変数からは呼べない。

var bar2:Bar = new Bar("bar", -345);
console.log(bar2.absNum());
console.log(Bar.hello);
console.log(Bar.str);