https://www.typescriptlang.org/docs/handbook/2/objects.html#excess-property-checks
一度代入する理由は [[TypeScriptのオブジェクト型は定義されていないプロパティがあるとエラーになる]] を参照。
```ts
type Human = {
id?: number;
name?: string;
};
// これは普通の使い方
const onlyId = {
id: 1,
};
const onlyIdHuman: Human = onlyId;
// 空でも定義通り
const empty = {};
const emptyHuman: Human = empty;
// 一度代入すればextraプロパティがあっても問題ない
const idAndExtra = {
id: 1,
extra: "hoge",
};
const idAndExtraHuman: Human = idAndExtra;
// ただし、オプショナルプロパティが1つも渡されず、extraプロパティのみの場合はNG
const onlyExtra = {
extra: "hoge",
};
const onlyExtraHuman: Human = onlyExtra; // エラー
```
<button class="playground"><a href="https://www.typescriptlang.org/play?#code/C4TwDgpgBAEgrgWwIYDsoF4oG8BQUoCWAJgPwBcUKiARhAE4DcelSCE5UAzsHQSgOZMAvkxwB6MVEDKDIBiGQPYMgOzNAWAmA7BkD+8oBEGQJ2mOAMYB7FNyiGANiACSRDNmbEKARgA0OEXsPGzlovGQoKvqg2XlaiElCAXl6A5gyAQQyAWdqAlf5KgFEM7kbAUBAIYKA2WG4G6ZnZoIH+sIhBmFk5IGGSgABygGV6gMdygKaKgJoMMoAODBAAHjxIgOsMgLcMgIsMgGMMgMUMgDIMgEIMgMYMgGYMMYDyqoAyGYBWDBppxsQAgihEAKIDdEh5dkSOLvj9gxQARAAW+vwQjy4FHhkHR6eDMoBSpoTB-E5nJD1KCAfQZAAYMgHUGQCADIAqhiGgHaGQDnDIAphkA1wyjSazByAEwYYoBCO0AqgwyQBaDEj7ucCdMVIB-BhUgBYNQAQKnIAHIAcV2GS8APOlzukKer3en1cTEKnhQ5mFSCBFT8wQVICVDCg4UAFQyAS4ZAD8MOCAA">Playground</a></button>