altJS、すなわちJavaScriptの代わりとなる言語の筆頭である「TypeScript」。TypeScriptという言語名が示す通り、JavaScriptに「Type」、つまり型の概念を持ち込んだものです。本連載では、このTypeScriptの型に関して、さまざまな方向から紹介していきます。前回は、オブジェクトのひな型となるクラスに関して、基本的な内容を紹介しました。今回はその続きとして、クラスの継承やクラスをnewしたオブジェクトそのものの型について紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
クラスを手軽に拡張する方法として、継承があります。この継承はJavaScriptにもある構文です。その構文を確認しながら、TypeScript独自の内容を紹介していきます。
継承とは、あるクラスのメンバをそっくり引き継ぎ、そのクラスを拡張したクラスを作成できる仕組みです。具体例を見ていきましょう。例えば、リスト1のようなクラスCalcBaseがあるとします。
class CalcBase { private _baseNum = 0; // (1) constructor(baseNum: number) { // (2) this._baseNum = baseNum; } get baseNum(): number { // (3) return this._baseNum; } }
このクラスを踏まえて、リスト2のクラスを作成したとします。
class CalcAdd extends CalcBase { getAddedNum(addNum: number): number { return this.baseNum + addNum; // (1) } }
クラス宣言に注目してください。リスト1のように「class クラス名」という構文ではなく、これに続けて「extends」キーワードが記述されています。このextendsが継承を表します。このextendsの次に記述されたクラスを「親クラス」といい、それに対してこれから作成するクラスを、「子クラス」といいます。構文としては次のようになります。
[構文1]継承 class クラス名 extends 親クラス
この子クラスでは、親クラスのメンバをそっくりそのまま含んだ状態となります(図1)。
CalcAddクラスには、メンバとしてgetAddedNum()メソッドしかありませんが、CalcBaseを継承しているため、親クラスであるCalcBaseのメンバである_baseNum、constructor()、baseNumゲッターが含まれた状態となります。そのためCalcAdd内では、リスト2の(1)のように、this.baseNumでbaseNumゲッターが利用できます。
また、このCalcAddクラスをnewしようとすると、リスト3の(1)のように引数を渡す必要があります。
const calcAdd = new CalcAdd(5); // (1) const ans = calcAdd.getAddedNum(3); // (2)
これは、CalcAddクラスにはコンストラクタが記述されていなくても、その親クラスであるCalcBaseのコンストラクタには、リスト1の(2)のように、引数が設定されているからです。もしこの引数を渡さなければ、図2のエラーとなります。
なお、newしたCalcAddクラスのメソッドgetAddedNum()を利用する場合は、リスト3の(2)のようなコードとなります。これに関しては、特に問題ないでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.