API の応答に型を付けるとき、どう書きますか。
unknown で受けて、実行時に形を確かめてから型を付けます。res.json() を await した値は any なので、User 型の変数に入れても as User と書いても、何も確かめていません。
面接官が見ているのは型を付けることと、確かめることを区別できるか。
これは「参画したプロジェクトで、any が数百か所に使われていました。どう進めますか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- unknown で受けて、実行時に形を検査してから型を付ける
その通りです。検査を通ったものだけが、その型として扱われます。 - await res.json() as User と書く
確かめていません。API が違う形を返しても、そのまま User として扱われます。 - await res.json() の結果を User 型の変数に代入する
await した res.json() の結果は any なので、何でも代入できてしまいます。as と同じく確かめていません。 - API 側も TypeScript なので、型を共有すれば検査は要らない
型を共有するのは有効ですが、デプロイの時期がずれれば形はずれます。境界では確かめます。
模範解答
unknown で受けて、実行時に形を検査してから型を付けます。
res.json() の戻り値は、標準の型定義では Promise<any> で、await した値は any です。そのため User 型の変数に代入しても、as User と書いても、何も確かめていません。API が項目名を変えたり null を返したりしても、TypeScript は何も言わず、ずっと先の処理で落ちます。
検査は、自分で型ガード関数(value is User を返す関数)を書くか、検証用のライブラリでスキーマを定義して行います。検査を通ったものだけを User として扱えば、その先は型を信用できます。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。
ここからどう深掘りされるか
この問いに答えられた場合、面談は次の質問に進みます。
観点をすべて押さえられた場合
型の定義と、実行時の検査の定義を別々に書いていたら、片方だけ直されてずれていました。どうしますか。