title: Why does TypeScript not throw an error when the function argument type is mismatched?
body: <p>Here's a very basic example to demonstrate what I mean:</p>
  
  <pre class="lang-js prettyprint-override"><code>type Payload = {
      id: number;
  }
  
  type GreatPayload = {
      id: number;
      surprise: 4;
  }
  
  type Action = (payload: Payload) =&gt; void;
  
  const action: Action = payload =&gt; null;
  
  const payload: GreatPayload = {
      id: 1,
      surprise: 4,
  };
  
  action({ id: 1, surprise: 4 }); // &lt;== as expected, this errors out because `surprise` is not present in `Payload`
  
  action(payload); // &lt;== my question is, why does this not throw an error?
  </code></pre>
  
  <p>(And the <a href="https://www.typescriptlang.org/play?#code/C4TwDgpgBACghiANgezgEygXigbwLABQUxUAlmgFxQB2ArgLYBGEATgNyEC+hhokUAcRYQ4weElQZs+IiXJU6TVh1nEAzrRZgWpNRCoAWFdwK9w0AIIBjYKWTUsUABRgEKdFXHu0ASiwA+KAA3ZHIVQit7NWAoOBs7aiprW3tHVwl0AJpaRERwgkjqaKh07yohETE3SUcZEjJKKABGABpCeo0tHT1DNoJOfLiU6iccBqpWqE7tXX0oAyhOH0H4+xdq9GWgA" rel="noreferrer">TypeScript playground link</a> for an editable example.)</p>
  
  <p>Why does <code>action(payload)</code> not throw an error when the type of <code>payload</code> that's passed in (<code>GreatPayload</code>) is clearly a mismatch for the function argument type <code>Payload</code>? </p>