見出し画像

TypeScript 入門の記録(66)プロを目指す人のためのTypeScript入門(50)第5章TypeScriptのクラス(10)

こんにちは。サイボウズ株式会社 開発本部 People Experienceチーム コネクト支援チームの貴島(@jnkykn)です。先週は、公立はこだて未来大学の学内ハッカソンP2HACKSのスポンサーとして、未来大学にお邪魔していました。毎年思うことですが、CI/CDが組み込まれていたり、新しいフレームワークが取り入れられていたり、P2HACKSの参加各チームのハイレベルなプロダクトを目の当たりにして「自分も新しい技術のキャッチアップをしていかないと!」と刺激をいただきました。新しい技術についても知りたいのですが、基礎も大切なので、今週は、TypeScript入門の続きです。(基礎固め重要)

thisまだ終わってなかった

関数の中以外のthis

今日は、関数の中以外のthisが指すものについて、学習します。クラスAのインスタンスのプロパティを取得するためのthisと、関数内のthisは同じ意味なので、this.fooは同じ値を指します。

class A {
    foo = 123;
    bar = this.foo + 100;
    getFoo() {
        return this.foo;
    }
}

const obj544 = new A();
console.log(`obj544.bar = ${obj544.bar}  getFoo() = ${obj544.getFoo()}`);

実行結果も、想定通りです。

$ node dist/index_5-4.js
obj544.bar = 223  getFoo() = 123

staticの場合

プロパティや関数がstaticの場合は、thisはインスタンスではなく、クラスAを指します。インスタンスのプロパティや関数としては扱えません。(staticなので、当然と言えますが)

class A {
    static foo = 123;
    static bar = this.foo * 2;
    static getFoo() {
        console.log(`bar is ${this.bar}`);
    }
}

const obj544 = new A();
console.log(`A.bar = ${A.bar} `);

実行結果を見ると、this.barはクラスAのプロパティbarであることが確認できます。

$ node dist/index_5-4.js
bar is 246
A.bar = 246

組み込みオブジェクトとクラス

配列などの、TypeScriptの組み込みオブジェクトとクラスの関係を学習します。

組み込みオブジェクトはクラスと似ている

組み込みオブジェクトは、それぞれ固有のプロパティやメソッドを持っていたり、new Map()のように、newでオブジェクトを作ることができるところがクラスと似ています。

const map544 = new Map<string, number>();
console.log(`map544 instanceof Map = ${map544 instanceof Map}`);

実行結果を見ると、newで生成したオブジェクトは、Mapのインスタンスであることがわかります。

$ node dist/index_5-4.js
map544 instanceof Map = true

これ、クラスと同じじゃない?って思いました。

Arrayの罠

Arrayコンストラクタは、複数のパラメータを渡すことができますが、パラメータとして整数が1つだけ渡された場合は配列サイズを定義し、複数のパラメータが渡された場合は、パラメータを要素とする配列が生成されます。(これは、罠)例えば、new Array(10)は、長さ10の配列を生成します。これは罠なので、配列リテラルを使う方が安心です。

継承もできる

多くの組み込みオブジェクトは継承でき、Arrayの継承クラスは静的メソッドofが使えるので、要素10が1つだけある配列を定義することができます。

const arr544 = Array.of(10);
console.log(arr544);

実行結果

$ npx tsc
$ node dist/index_5-4.js
[ 10 ]

T型の配列は、T[]またはArray<T>と表します。Array<T>は、Tという型引数を持つArray型のことなので、配列は、Arrayクラスのインスタンスと考えることができます。

Arrayを継承したRepeatArrayクラスを定義してみます。

class RepeatArray<T> extends Array<T> {
    repeat(times: number): RepeatArray<T> {
        const result = new RepeatArray<T>();
        for (let i = 0; i < times; i++) {
            result.push(...this);
        }
        return result;
    }
}

const arr544 = new RepeatArray(1, 2);
arr544.push(3);
const repeated = arr544.repeat(3);
console.log(repeated);

実行結果

$ node dist/index_5-4.js
RepeatArray(9) [
  1, 2, 3, 1, 2,
  3, 1, 2, 3
]

RepeatArray(1, 2)で、arr544には[1, 2]が設定され、RepeatArrayはArrayを継承しているので、pushが使用できます。arr544.push(3)の結果arr544は、[1, 2, 3]になります。arr544.repeat(3)の結果、[1, 2, 3]が3回繰り返し格納されるので、[1, 2, 3, 1, 2, 3, 1, 2, 3]が得られます。

まとめ

今日は、関数の中以外のthisと、組み込みオブジェクトとクラスについて学習しました。ふんわり雰囲気で使っていた組み込みオブジェクトのことも、整理できました。次は、例外処理について学習する予定です。


いいなと思ったら応援しよう!