TypeScript: インデックス型 (index signature)

参考: https://typescriptbook.jp/reference/values-types-variables/object/index-signature

  • TypeScript で、オブジェクトのフィールド名をあえて指定せず、プロパティのみを指定したい場合がある
  • そのときに使えるのがインデックス型(index signature)
  • たとえば、プロパティがすべて number 型であるオブジェクトは次のように型注釈する
  • インデックス型のフィールド名の型は string、number、symbol のみが指定できる
type Obj = {
  [K: string]: number;
};
  • インデックス型のオブジェクトであれば、フィールド名が定義されていないプロパティも代入できる
  • たとえば、インデックス型{ [K: string]: number }には、値が number 型であれば、a や b など定義されていないフィールドにも代入できる
type Obj = {
  [K: string]: number;
};

const obj: Obj = { a: 1, b: 2 }; // OK
obj.c = 3; // OK
  • インデックス型は Record<K, T>ユーティリティ型を用いても表現できる
  • 次の 2 つの型注釈は同じ意味になる
type Obj = {
  [K: string]: number;
};

type Obj = Record<string, number>;