TypeScript のクラスは継承をサポートします。クラスを継承するためにはキーワード extends を使用します。
class Foo { constructor(private language: string) { } public greet(): string { return "Hello, " + this.language; } } class Bar extends Foo { constructor() { // 基底クラスのコンストラクタを呼び出す super("TypeScript"); } public greetExclamation(): string { // 基底クラスの public メンバにアクセスできる return this.greet() + "!"; } } var bar: Bar = new Bar; var result1: string = bar.greet(); // "Hello, TypeScript" var result2: string = bar.greetExclamation(); // "Hello, TypeScript!"
上記の例では、クラス Bar (派生クラス)はクラス Foo (基底クラス)を継承します。 継承クラスは基底クラスの public メンバにアクセス可能です。
派生クラスのコンストラクタで基底クラスのコンストラクタを呼び出すためには、 super() を使用します。 派生クラスにて、コンストラクタにパラメータプロパティ宣言がある場合や、 インスタンスメンバ変数に初期値が指定されている場合は、コンストラクタで super() を最初に呼び出す必要があります。
派生クラスでコンストラクタを省略した場合は、自動コンストラクタが基底クラスのコンストラクタを呼び出します。
基底クラスの public メンバ関数と同じ名前のメンバ関数を派生クラスで宣言することで、 メンバ関数をオーバーライドできます。 次に示すのは、クラス Foo の greet() をクラス Bar でオーバーライドする例です。
class Foo { constructor(private language: string) { } public greet(): string { return "Hello, " + this.language; } } class Bar extends Foo { constructor() { super("TypeScript"); } public greet(): string { // 基底クラスの同名の public メンバにアクセスできる return super.greet() + "!"; } } var bar: Bar = new Bar; var result: string = bar.greet(); // "Hello, TypeScript!"
super プロパティを使用することで、基底クラスの同名の public メンバにアクセス可能です。