クラス

宣言

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

次に示すのは、クラス宣言の書式です。

class クラス名 {
    // コンストラクタ
    constructor(アクセス修飾子 引数名: 引数の型名) {
    }
    
    // インスタンスメンバ
    アクセス修飾子 メンバ変数名: メンバ変数の型名;
    アクセス修飾子 メンバ関数名(引数名: 引数の型名): 戻り値の型名 { 
        return 戻り値;
    }
    アクセス修飾子 get メンバアクセサ名(): 戻り値の型名 { 
        return 戻り値;
    }
    アクセス修飾子 set メンバアクセサ名(引数名: 引数の型名) { 
    }
    
    // 静的メンバ
    static メンバ変数名: メンバ変数の型名;
    static メンバ関数名(引数名: 引数の型名): 戻り値の型名 { 
        return 戻り値;
    }
    static get メンバアクセサ名(): 戻り値の型名 { 
        return 戻り値;
    }
    static set メンバアクセサ名(引数名: 引数の型名) { 
    }
}

コンストラクタやメンバ関数はオーバーロード可能です。 また、すべてのクラスは自動的に prototype という名前の静的メンバを含むため、この名前の静的メンバを宣言することはできません。

コンストラクタ

コンストラクタは省略可能です。省略した場合は、引数を持たない空の自動コンストラクタが提供されます。 コンストラクタの引数には、クラスのメンバ変数を同時に宣言して引数の値で初期化する「パラメータプロパティ宣言」機能が用意されています。 次に示すのは、この機能を利用する例です。

class Foo {
    constructor(private x: number, private y: string) {
    }
}

これは、次のクラスと同等です。

class Foo {
    private x: number;
    private y: string;
    constructor(x: number, y: string) {
        this.x = x;
        this.y = y;
    }
}

コンストラクタ内では this はインスタンスの型です。

ところで、コンストラクタの型(シグネチャ)は、コンストラクタ型リテラルとして表現できます。次に示すのは、コンストラクタ型リテラルの書式です。

new (引数の型のリスト) => 生成するインスタンスの型;

次に示すのは、Number 型の引数 x と String 型の引数 y を持ち、Foo クラスのインスタンスを生成するコンストラクタ型リテラルです。

new (x: number, y: string) => Foo;

アクセス修飾子

アクセス修飾子は省略可能です。省略した場合はデフォルトで public となります。 public はクラスの外からもアクセス可能であるのに対し、 private はクラスの中のみからアクセス可能です。 静的メンバはアクセス修飾子を指定することはできず、常に public です。

インスタンスメンバ

次に示すのは、インスタンスメンバ関数を呼び出す例です。

class Foo {
    private language: string = "TypeScript";
    constructor(language?: string) {
        if (language !== undefined) {
            this.language = language;
        }
    }
    public greet(): string {
        return "Hello, " + this.language;
    }
}

var foo = new Foo;
var result: string = foo.greet();  // "Hello, TypeScript"

クラスのインスタンスを生成するためには new 演算子を使用します。インスタンスメンバ関数内では this はインスタンスの型です。

静的メンバ

次に示すのは、静的メンバ関数を呼び出す例です。

class Foo {
    static language: string = "TypeScript";
    static greet(): string {
        return "Hello, " + this.language;
    }
}

var result: string = Foo.greet();  // "Hello, TypeScript"

静的メンバ関数内では this はコンストラクタの型です。

アクセサとコンパイラオプション

TypeScript コンパイラはデフォルトで ECMAScript 3rd Edition 向けにコンパイルするため、 アクセサを使用する場合は ECMAScript 5th Edition 向けにコンパイルするようにコンパイラオプションを指定する必要があります。 これは、アクセサが ECMAScript 5th Edition の Object.defineProperty を使用して実装されるためです。 次に示すのは、TypeScript コンパイラオプションを指定する方法です。

tsc --target ES5 hello.ts

Visual Studio 2012 の場合は、プロジェクトファイル(拡張子 .csproj )をエディタで開き、TypeScriptTarget を ES3 から ES5 に変更します。

<TypeScriptTarget>ES5</TypeScriptTarget>