TSの余剰プロパティ検査は変数渡しでは効かず未宣言フィールドが暗黙送信される
TypeScript
設計判断
TypeScript の excess property check(余剰プロパティ検出)はオブジェクトリテラルを直接渡したときだけ働く。変数やスプレッド経由で渡すと、宣言にないプロパティがあっても構造的部分型として代入が通り、コンパイルエラーにならない。
起きやすい場面と実害
- フォームの値(追加フィールドを含む型)をそのまま、あるいはスプレッドで API リクエスト関数に渡すと、リクエスト型にそのフィールドが宣言されていなくても型エラーにならず、実行時には HTTP クライアントがオブジェクト全体を直列化して送信する。
- 結果、「型契約(リクエスト型)には無いが実際には送られている」乖離が生まれ、読み手は型から送信内容を判断できず、そのフィールドの形も型検査されない。
判断基準・対策
- リクエスト/レスポンスの型は「実際に送受信する内容」と一致させ、送るフィールドは必ず型に宣言する。
- 送ってはいけない内部状態を含むオブジェクトを丸ごと渡さない。必要なフィールドだけを明示的に組み立てて渡す。
検証方法
リクエスト型に宣言していないフィールドを変数に足しても型エラーにならないことを確認し、実際の送信 body と型定義が一致しているかをレビューする。