Skip to content

3.2 オブジェクトの型

TypeScriptでは、オブジェクトがどのようなプロパティを持ち、それぞれの値がどの型であるかを定義する 「オブジェクト型」 を使用します。

オブジェクト型は、{ プロパティ名: 型; ... } という形式で記述します。

  • 基本形: const obj: { name: string; age: number } = { name: "indigo", age: 50 };
  • 型推論: 変数宣言時に初期値がある場合、TypeScriptは自動的にオブジェクト型を推論します。

3.2.2 オブジェクト型の型チェックと安全性

Section titled “3.2.2 オブジェクト型の型チェックと安全性”

定義されたオブジェクト型に対し、実際のオブジェクトが適合しているかが厳密にチェックされます。

  • 不足の禁止: 型で定義されたプロパティが存在しない場合はエラーになります。
  • 型不一致の禁止: 定義された型とは異なる型の値を代入しようとするとエラーになります。
  • 余剰プロパティチェック: オブジェクトリテラルを直接代入する際、型に定義されていないプロパティがあるとエラーになります。

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;