【TypeScript】Object.keys() に keyof typeof で型をつける

(TypeScript のバージョンは 3.7 である)

Object.keys() は文字列の配列型を返す。

const SomeObject = {
  FOO: 'foo',
  BAR: 'bar',
  BAZ: 'baz',
}

// string[] 型
const keys = Object.keys(SomeObject)

for (const key of keys) {
  // key は string 型なのでこれは型エラーになる
  const value = SomeObject[key]
}

オブジェクトのキーが既知である場合、keyof typeof を使うと次のようにして Object.keys() を「オブジェクトのキーの配列型」に型変換できる。

const SomeObject = {
  FOO: 'foo',
  BAR: 'bar',
  BAZ: 'baz',
}

const keys = Object.keys(SomeObject) as (keyof typeof SomeObject)[]

for (const key of keys) {
  // 型チェックが通る
  const value = SomeObject[key]
}

だけど、これは JavaScript の発想で、TypeScript の郷に入るとまた違った流儀がある。個人的には Object.keys() をできるだけ使わないほうが TypeScript らしいコードになると思う。