TypeScript 少しわかりにくい過剰プロパティチェックの動き

オブジェクトリテラル型に存在しないプロパティがある場合に、過剰プロパティチェックの働きによってエラーが発生します。

例えば以下のコードでは、Data型にはinvalidというプロパティは定義されていませんので、過剰なプロパティが検知されたとしてエラーになります。

type Data = {
    hoge: string
    foo: number
}

const myFunc = (d: Data) => {}

myFunc({hoge: '123', foo: 123, invalid: true}) 
// Object literal may only specify known properties, and 'invalid' does not exist in type 'Data'.

ただ、この過剰プロパティチェックは毎回実施されるわけではないことに注意が必要です。

型アサーションを使用している場合や変数に割り当てられている場合は、実施されません。

//型アサーションを使用している場合
myFunc({hoge: '123', foo: 123, invalid: true} as Data) //エラーにならない
//一度変数に割り当てている場合
let d = {hoge: '123', foo: 123, invalid: true}
myFunc(d) //エラーにならない

過剰プロパティチェックはコードを安全にする便利な機能ですが、このように少し特殊な動きをするので注意が必要です。