Repository: TypeScript
Issue: Error elaborations should not be de-duped
Labels: Suggestion,Awaiting More Feedback

<!-- 🚨 STOP 🚨 𝗦𝗧𝗢𝗣 🚨 𝑺𝑻𝑶𝑷 🚨

Half of all issues filed here are duplicates, answered in the FAQ, or not appropriate for the bug tracker. Even if you think you've found a *bug*, please read the FAQ first, especially the Common "Bugs" That Aren't Bugs section!

Please help us by doing the following steps before logging an issue:
  * Search: https://github.com/Microsoft/TypeScript/search?type=Issues
  * Read the FAQ: https://github.com/Microsoft/TypeScript/wiki/FAQ

Please fill in the *entire* template below.
-->

<!-- Please try to reproduce the issue with `typescript@next`. It may have already been fixed. -->
**TypeScript Version:**  3.5.1

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:**

+ Error message different

**Code**

```ts
interface ExprData {
  mapper : () => unknown,
  blah : string,
}
interface Expr<DataT extends ExprData> {
  mapper : DataT["mapper"],
  blah : DataT["blah"],

  extra : number,
}

declare function where (
  callback : () => Expr<{
    mapper : () => boolean,
    blah : string,
  }>
) : void;

declare function getInvalidWhere () : Expr<{
  mapper : () => (boolean|null),
  blah : string,
}>;

/*
Type 'Expr<{ mapper: () => boolean | null; blah: string; }>' is not assignable to type 'Expr<{ mapper: () => boolean; blah: string; }>'.
  Type '{ mapper: () => boolean | null; blah: string; }' is not assignable to type '{ mapper: () => boolean; blah: string; }'.
    Types of property 'mapper' are incompatible.
      Type '() => boolean | null' is not assignable to type '() => boolean'.
        Type 'boolean | null' is not assignable to type 'boolean'.
          Type 'null' is not assignable to type 'boolean'.
*/
where(() => getInvalidWhere())
/*
  Expected: Same error as above,
  Actual:
    Type 'Expr<{ mapper: () => boolean | null; blah: string; }>' is not assignable to type
    'Expr<{ mapper: () => boolean; blah: string; }>'.
*/
where(() => getInvalidWhere())
```

**Expected behavior:**

+ Both errors should have the same error message, if they're in the same file.
+ Both errors should have the same error message, if they're in **different** files.

**Actual behavior:**

+ Both errors have different error messages in the same file.
+ Both errors have different error messages in **different** files.

**Playground Link:** 

[Playground](http://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgKIA8AOUAicxzIDeAUMsgLZyabTIBcyAFAJTIC8AfMgK4gDWIAPYB3EABoyyAEYAbOAAsGyAM5gooAOaSAviVCRYiFBmwAePAQAqyCOkggAJirRZc+ON1LkqNOo0s4KwBtACJfWihQgF1JcjlFZUCQ0ISFGMkpO3VCRhAeCmloXRISRwgEeSgUGD4EMGAhEGQRBWgUJikEOFlZaUR+ZVYOblMoM29ySmpIobYuGSEhWQg4CSl4+SVGNQ0QbSkdThI2RgA3IWBHAG5S8sq4auRakHrG5s0IMABJEDOeq4AdTaT2GjDGEykEX8zHm3CY0iWKzWAB98r0WHEZFtlLstLpOLcSAB6ABUJCsAE9aMgAOQQojTPxQRjDBaI5arZoo5Do2TXbGKHbqLQCo605DAFzCMDIOAqFTATQgOByFBgITIMDUlD0twTJmRVlwxactYCtLCvaaMWcWkAOikVJptMZ0JZsJGpuR3N5PF6Fq2VtFyB0EqlvKEsvliuVqpWWs12pdbpm0GNXo5PsDQtUIv2YodG2QzogLiEMGQ2CEkW1dPdEseKFACCEFEw+GAasdUympbpbO4Wa5yB5fPD0qjcoVSpVasTWp1A5Nw7WRd7vf7tNXvvHksn0ZncfnGsXLp3643m6XtL3EZl09jc4Tp+TuovjtJxJIrXaTEHyCfD8fwAo4wJ-iwLAkuS5CmBUkCOIwADKcAUCg0BQEIUDTnKiJnBAWIAIL1DwPT0MWW4Moa6aeuySIjmO-r8oKCjBgWoZ2vukaHk+8bqkmOrFnq5ipsyGZ0WaIA5qxebWraRZfj+IIQP+JpAb8-yyECymsCwQA)

**Related Issues:** <!-- Did you find other bugs that looked similar? -->