IT-Q

const routes: Record<string, string> = { home: "/", about: "/about" } と書いたら、routes.contact のような存在しないキーでもエラーにならなくなりました。どうしますか。

型注釈をやめて satisfies Record<string, string> にします。形は検査されつつ、変数の型は具体的なキーのまま残るので、存在しないキーはエラーになり、補完も効きます。

面接官が見ているのはsatisfies で、検査と具体的な型を両立できるか。

よくある答えと、面談でどう見られるか

  • 型注釈をやめて satisfies Record<string, string> にする。形の検査はしつつ、キーは具体的なまま残る
    その通りです。4.9 の satisfies は、この「検査はしたいが型を広げたくない」のための演算子です。
  • 型注釈を外して、型を書かない
    キーは具体的になりますが、値が文字列であることの検査が無くなります。
  • as Record<string, string> と書く
    型注釈と同じく型が広がるうえ、合っていなくても通ってしまいます。
  • Record をやめて any にする
    すべての検査を失います。

模範解答

型注釈をやめて satisfies を使います。

  const routes = { home: "/", about: "/about" } satisfies Record<string, string>

型注釈(: Record<string, string>)にすると、routes の型がそのまま Record<string, string> になり、どんな文字列のキーでも読めるので、routes.contact もエラーになりません。

satisfies(TypeScript 4.9 で追加)は、Record<string, string> に合っているかを検査しますが、routes の型は推論された { home: string; about: string } のまま残します。存在しない routes.contact はエラーになり、補完も効きます。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。