TypeScriptでpropertyを舐める処理が面倒くさい

TypeScript面倒くさい問題の一つ、プロパティを列挙してアクセス

TypeScriptでオブジェクトの全プロパティを走査するときの注意点 | JavaScript/TypeScriptメモ

これです。

JavaScript の時は伝統的に

for (const k in obj) {
  obj[k]
}

こういうコードをカジュアルに書いてしまっていたんだけど、TypeScript では

for (const k in obj) {
  obj[k] // <- error !
}

怒られます。1

これは k として取得できる key の型が string になってしまうため2。この結果

  • obj[k] として値が取得可能な key とは限らない
  • その結果 obj[k]any になってしまう
  • もしこれを何かに代入すると unsafe ですよ

が起きるから。

どうせ値のチェックは自分でやるので

obj[k as keyof typeof obj]

と書きましょう。

どうせ値のチェックはするので。 するよね?

  1. for でも Objecy.keys() でも一緒 

  2. コンパイルした場合。language server レベルでは怒られない。 

More