title: DeepMerge<> generic not supporting deep optional
body: <p>I have a <code>DeepMerge&lt;&gt;</code> generic below that is not supporting deep optional merges.</p>
  
  <pre><code>type DeepMerge&lt;T, U&gt; = [T, U] extends [object, object] ?
    {
      [K in keyof (U &amp; Pick&lt;T, Exclude&lt;keyof T, keyof U&gt;&gt;)]: (
        K extends keyof U ? (
          K extends keyof T ? DeepMerge&lt;T[K], U[K]&gt; : U[K]
        ) : (
          K extends keyof T ? T[K] : never
        )
      )
    } : U;
  </code></pre>
  
  <p>I have a <code>Person</code> with a deep optional <code>address</code>.</p>
  
  <pre><code>type Person = {
    name: string,
    age: number,
    address: {
      line1: string,
      line2: string | null | number,
      zip: string | number,
      address?: {
        line1: string,
        line2: string | null | number,
        zip: string | number,
      },
    },
  };
  </code></pre>
  
  <p>I want to overwrite the deep <code>address</code> and add <code>burger</code>.</p>
  
  <pre><code>type PersonOverwrites = {
    address: {
      pizzaDelivery: boolean,
      address?: {
        burger: boolean,
      },
    },
  };
  </code></pre>
  
  <p>Here is is complaining:</p>
  
  <pre><code>const person: DeepMerge&lt;Person, PersonOverwrites&gt; = {
    name: 'Thomas',
    age: 12,
    address: {
      line1: 'hi',
      line2: 'hi',
      zip: 'hi',
      pizzaDelivery: true,
      address: {
        line1: 'hi',
        line2: 'hi',
        zip: 'hi',
        burger: true,
      },
    },
  };
  </code></pre>
  
  <p>It should require <code>line1</code>, <code>line2</code>, <code>zip</code>, <code>burger</code>.</p>
  
  <p><a href="https://i.stack.imgur.com/1H72B.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1H72B.png" alt="enter image description here"></a></p>
  
  <blockquote>
    <p>Type '{ line1: string; line2: string; zip: string; burger: true; }' is not assignable to type '{ burger: boolean; }'.
      Object literal may only specify known properties, and 'line1' does not exist in type '{ burger: boolean; }'.</p>
  </blockquote>
  
  <p>It should be supporting <code>{ line1: string; line2: string; zip: string; burger: true; }</code> but instead the entire deep object is being overwritten to <code>{ burger: boolean; }</code>.</p>