IT-Q

{ 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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。