見出し画像

TypeScript 入門の記録(38)プロを目指す人のためのTypeScript入門(23)オブジェクトの型(その2)

ちょっと学習方法を変えてみようかなと思いつつ、地道にやっていきます。
前回に続き、オブジェクトの型について学習します。

オブジェクトの型(その2)

前回は、「インデックスシグネチャは型安全でない場合があるので注意が必要だ」というところまで学習しました。コラムを読み進むと、インデックスシグネチャは「オブジェクトを連想配列として使う場合」など使い道があるものの、古い機能なので非推奨と書かれていました。多くの場合は Mapオブジェクトで代替でき、Mapオブジェクトは型安全なので安心して使えるそうなので、意識しておきたいと思います。

オプショナルなプロパティの宣言

オプショナルなプロパティは、あってもなくても良いプロパティですが、値が未定義の場合は、そのプロパティ値を使った計算ができません。未定義のまま計算をしないように、undefinedの場合の処理を条件分岐で定義することができます。これは、オプショナルなプロパティに限らず、undefinedの可能性がある場合は考慮が必要なやつですね。

オプショナルプロパティがundefinedの場合の処理を定義しておけばOK

読み取り専用プロパティの宣言

オブジェクトをconst定義しても、プロパティには再代入できるので、再代入を禁止したいプロパティにreadonlyを付けることができます。定数として使いたい場合は、readonlyをつけて読み取り専用にしておけば安心ですね。ただし、関数のパラメータとして普通のオブジェクトを受け取る場合に、readonlyプロパティを持つオブジェクトが渡せるため、関数内で受け取ったreadonlyプロパティに値の再代入ができてしまうという、TypeScriptのチェックの不完全性があるとのこと。詳しくは関数の章で改めて学習します。

readonlyプロパティには値を再代入できない

typeofキーワードで変数の型を得る

typeofは、他のプログラミング言語でも馴染みがあるので、TypeScriptの場合の使い方について確認していきます。

typeofで変数の型を得る
定義されたオブジェクトの型推論をもとに別のオブジェクトを定義する

typeofキーワードで変数の型を求めるのは、他のプログラミング言語と変わりないと思いましたが、TypeScriptの場合、typeof演算子が別に存在するそうなので、混同しないように注意が必要だなと思いました。また、この章のコラムによると、typeofで型を求めて変数の型として利用する方法は濫用すべきではないようです。プログラム内で扱う変数の型を明示的に宣言する方がわかりやすいプログラムになるというのは、確かにそうだなと思うので、安易に使わないように気をつけたいと思います。
コラムにあった、例外的に型ではなく値が最上位にの事実として扱われる例を試してみます。文字列リテラルの配列をもとに型が定義される方が、型を構成する文字列リテラルを2回記述しなくて済み、プログラムがすっきりします。

文字列配列の定義を型として使う場合は、typeofで型を得る方がわかりやすいプログラムになる

オブジェクト型まとめ

オブジェクト変数として定義するだけでなく、それを型として宣言したり、変数に制限を与えたりできることを理解しました。オブジェクト型の記法に慣れていないので、変数としてオブジェクトを宣言する際の記法と混同して書き直したりしてしまうので、当面は注意しながらコーディングしていく感じになりそうです。

この記事が気に入ったらサポートをしてみませんか?