title: Why isn't {a: never} equivalent to never?
body: <p>It seems like <code>{a: never}</code> should be able to be simplified to <code>never</code>. Doing so would fix my issues below. Is there a reason this isn't possible?</p>
  
  <pre><code>type A = {tag: 'A', value: number}
  type B = {tag: 'B', value: boolean}
  type N = {tag: never, value: string}
  
  type Ntag = N["tag"] // never
  type Nvalue = N["value"] // string
  // Couldn't N["value"] be simplified to never because an object of type N could never exist?
  // And thus, couldn't N be simplified to never?
  
  type AN = A | N
  type ANtag = AN["tag"] // "A"
  type ANvalue = AN["value"] // Expected: number, Actual: string | number
  // AN has to be an A, an object of type N can't exist. So why can't AN["value"] be simplified to number?
  
  type AB = A | B
  type NarrowToA = AB &amp; {tag: 'A'} // Expected A, Actual: (A &amp; {tag: "A"}) | (B &amp; {tag: "A"})
  type NarrowToATag = NarrowToA["tag"] // A
  type NarrowToAValue = NarrowToA["value"] // Expected number, Actual number | boolean
  // Again, NarrowToA has to be an A, an object of type B would never fit. So why can't NarrowToA["value"] be simplified to number?
  </code></pre>
  
  <p><a href="https://www.typescriptlang.org/play?#code/C4TwDgpgBAglC8UDewCGBzAXFA5DHANFAG6oA2ArhNgHYUC2ARhAE4C+AUKJFAEILI0WXL0IlyVbIwD20shFQ1O3aADkBKDLQjFWRUpWpQAzsBYBLGuk5dwaoQNUBtAERCXAXSgB6b1Bo6rLY8qgZUjq5hEJ4+fqYWVhy+UADC0hRkACY0OMBQzi5RMcwm5vRgZOYAZuYQmVDA0v6BLFDMAMaoFMbQilDSjABWEO150lUNdvlQ7elZzbqtEAAe5qYA-El+MDT1wAAW3USzGdm50yXGZRXVtXtNAYubwdAw6ohwAD75L7CqDh8Cu4vMkXDAXL83lEBG9IhJoiC-ABRZaQUZ1WgMZgsIgwUYUcjYeKWdBQb50JhBZJvKD7VDGBpNEp9GBEPoDYajfoTFTTTo5PIrNbAAB0UAAyk0AO77EAzRTnWGFeHFaBXcqVGp1Rn+LGsZ68mD8D5kvi-VSoFgsaRSgAq0jgH34ADJBFpcPg2LEoCi0cBtazYPjCVAABRwV2aYRglxsACUptDLrd0fB8fNlutdodtowjkzNvtMFcwO9MAzVsLDoAavD85Xs8XlYYYslfSN-fUKdjccGyLrKa1vjI5AoaFtYOhUJYiBaG0XafSdcyaLA2auOR3uZMePwpXMuy0oDVRRLpbL5QL8gXG3CW15LtdNXcdd39UA" rel="nofollow noreferrer">Playground Link</a></p>