{ name: string } 型を受け取る関数に、{ name: "a", age: 3 } を変数に入れてから渡すと、どうなりますか。
TypeScript は型の名前ではなく形で互換性を判断します。必要なプロパティがあれば余分があっても通ります。ただしオブジェクトリテラルを直接渡したときは余分がエラーになります。
面接官が見ているのは構造的部分型(structural typing)を理解しているか。
よくある答えと、面談でどう見られるか
- エラーにならない。必要なプロパティを持っていれば、余分なプロパティがあっても通る
その通りです。型の名前ではなく形で判断します。 - 余分なプロパティがあるのでエラーになる
オブジェクトリテラルを直接渡したときはエラーになります(余剰プロパティの検査)。変数を経由すると通ります。 - 型の名前が違うのでエラーになる
TypeScript は型の名前では比べません。形(持っているプロパティ)で比べます。 - age が自動で削除されて渡される
値は変わりません。age も付いたまま渡ります。
模範解答
エラーになりません。TypeScript は、型の名前ではなく形で互換性を判断します。必要なプロパティ(name: string)を持っていれば、余分なものが付いていても受け付けます。これを構造的部分型と呼びます。
ただし例外があります。オブジェクトリテラルを直接引数に書いた場合は、余分なプロパティがエラーになります(余剰プロパティの検査)。打ち間違いを見つけるための検査で、変数に入れてから渡すと働きません。
この性質は、「型が合っていれば、余分なデータが付いていない」とは限らないことを意味します。たとえばパスワードを含むオブジェクトでも、型の上では通ってしまいます。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。