3.2 オブジェクトの型
TypeScriptでは、オブジェクトがどのようなプロパティを持ち、それぞれの値がどの型であるかを定義する 「オブジェクト型」 を使用します。
3.2.1 オブジェクト型の記法
Section titled “3.2.1 オブジェクト型の記法”オブジェクト型は、{ プロパティ名: 型; ... } という形式で記述します。
- 基本形:
const obj: { name: string; age: number } = { name: "indigo", age: 50 }; - 型推論: 変数宣言時に初期値がある場合、TypeScriptは自動的にオブジェクト型を推論します。
3.2.2 オブジェクト型の型チェックと安全性
Section titled “3.2.2 オブジェクト型の型チェックと安全性”定義されたオブジェクト型に対し、実際のオブジェクトが適合しているかが厳密にチェックされます。
- 不足の禁止: 型で定義されたプロパティが存在しない場合はエラーになります。
- 型不一致の禁止: 定義された型とは異なる型の値を代入しようとするとエラーになります。
- 余剰プロパティチェック: オブジェクトリテラルを直接代入する際、型に定義されていないプロパティがあるとエラーになります。
3.2.3 type 文で型に別名をつける
Section titled “3.2.3 type 文で型に別名をつける”type 文(型別名宣言)を使うと、特定の型に名前を付けて再利用できます。
- 構文:
type User = { name: string; age: number }; - メリット: 複雑な型に意味のある名前を付けることで、コードの可読性が向上し、同じ型を複数の場所で使い回せます。
3.2.4 interface 宣言でオブジェクト型を宣言する
Section titled “3.2.4 interface 宣言でオブジェクト型を宣言する”interface を使ってもオブジェクトの型を定義できます。
- 構文:
interface User { name: string; age: number; } - type文との違い: 多くの場合は
type文で代用可能ですが、interfaceはクラスのimplementsに使われるなど、よりオブジェクト指向的な特徴を持ちます。
3.2.5 任意のプロパティ名を許容する型(インデックスシグネチャ)
Section titled “3.2.5 任意のプロパティ名を許容する型(インデックスシグネチャ)”プロパティ名が事前に決まっていない場合、インデックスシグネチャ を使用できます。
- 記法:
{ [key: string]: number }(すべてのプロパティ名がstringで、値がnumberであることを示す)
3.2.6 オプショナルなプロパティの宣言
Section titled “3.2.6 オプショナルなプロパティの宣言”あってもなくてもよいプロパティは、プロパティ名の後ろに ? を付けます。
- 記法:
{ name: string; age?: number }
3.2.7 読み取り専用プロパティの宣言
Section titled “3.2.7 読み取り専用プロパティの宣言”後から書き換えを禁止したいプロパティには readonly を付けます。
- 記法:
{ readonly id: number; name: string }
3.2.8 typeof キーワードで変数の型を得る
Section titled “3.2.8 typeof キーワードで変数の型を得る”既に存在する変数から型を抽出して利用することができます。
- 記法:
type NewType = typeof existingObj;