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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。
ここからどう深掘りされるか
この問いに答えられた場合、面談は次の質問に進みます。
観点をすべて押さえられた場合
上の routes で、routes.home の型を "/" というリテラル型のまま残したい。どう書きますか。一部しか触れられなかった場合
変数に型注釈を付けると、その変数の型はどうなりますか。触れられなかった場合
変数に型注釈を付けると、その変数の型はどうなりますか。