Repository: TypeScript
Issue: Unmet parameter type in function call is misleading the compiler when those parameters involve inherited interfaces
Labels: Bug

<!-- 🚨 STOP 🚨 STOP 🚨 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 the latest published version. It may have already been fixed.
For npm: `typescript@next`
This is also the 'Nightly' version in the playground: http://www.typescriptlang.org/play/?ts=Nightly
-->
**TypeScript Version:**  3.8.x, 3.9.x, Nightly

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:**
- TS2322 wrong
- Incorrect error TS2322
- TS2322 Type is missing the following properties from type
- Parent interface is missing properties of child

**Code**

```ts
interface I1 {
    id: string;
    i1prop1: string;
}

interface I2<T> {
    id: keyof T & string;
    i2prop1: string;
}

interface FnParams<T extends I1> {
    param1: I2<T>[];
    param2: T[];
    param3: keyof T & string;
    param4: string;
}

const fn1 = <T extends I1>(args: FnParams<T>) => {
    // whatever use of args
 };

interface I4 extends I1 {
    i4prop1: string;
}

const val1: I2<I4>[] = [
    { id: "id", i2prop1: "lorem" },
    { id: "i1prop1", i2prop1: "ipsum" },
];

const val2 = [
    { id: "id1", i1prop1: "lorem", i4prop1: "ipsum" },
    { id: "id2", i1prop1: "lorem", i4prop1: "ipsum" },
];

fn1({
    param1: val1,
    param2: val2,
    param3: "i1prop1",
});
```

**Expected behavior:**
- Error is highlighted on the entire object given as function argument as it is missing `param4` property
- `TS2345`(-like) error pointing to `FnParams` unmet, something like
> Argument of type '{ param1: I2<I4>[]; param2: I4[]; param3: string; }' is not assignable to parameter of type 'FnParams<T extends I1>'. Property 'param4' is missing in type '{ param1: I2<I4>[]; param2: I4[]; param3: string; }' but required in type 'FnParams<T extends I1>'.

**Actual behavior:**
- Error is highlighted on `param1` which value is correct as per `param1`'s expected type
- `TS2322` error saying 
> Type 'I2<I4>[]' is not assignable to type 'I2<I1>[]'. Type 'I2<I4>' is not assignable to type 'I2<I1>. Property 'i4prop1' is missing in type 'I1' but required in type 'I4'.

Note that to fix the error I just need to set `param4` on the object passed in `fn1()` which does nothing to have with the error reported by the compiler:

```typescript
fn1({
    param1: val1,
    param2: val2,
    param3: "i1prop1",
    param4: "having this set fix the error which is normal",
});
```

**Playground Link:** [Provided](https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgJIEZkG8BQz-LAAmAXMgM5hSgDmA3HgcOgA5QD2L6Zl1I9OAL44coSLEQpUAJgA8AFQB82RvmJkA1hACe7GMnnIAZBSq0GBQtLadupvgOGjw0eEmQAxEAAU4UOAC25ArIEAAekCBE5GjoyriWLH6BdjIKigDaALoWBEn+AdJk8tm5+PmBAMyaOnoGxvbmqsgVAQAsPGb8DE4I7CCUyDAgmAC8yCHhkdGxigAUfjTkZF6+BcFKAJTIo-HNAPT7yADuABZwkABu0MgAruQodYvkeIIMzuJuUm2hERBRMQwKkswDaNi4nQcPREfQGYGQlzgABtUnJUG1MlkdsgMs0sIRSMgAETEIkAGis4LsRKR7CgEACROQgjJeIJZBJrA4XHJlO51OALHIt0ZzNZORh-UGiKRRTQbWy2Nxlnx6mJxHQvOYVI5tPpjIpoJ16qFIqZLLZapJRGkWq5tl1dIZWrB-I5guFootEpww3QcwSeWSATsMvQrMSwblMukEaDBWq6vtPNZgk2dCAA)

<details><summary><b>Output</b></summary>

```ts
"use strict";
const fn1 = (args) => {
    // whatever use of args
};
const val1 = [
    { id: "id", i2prop1: "lorem" },
    { id: "i1prop1", i2prop1: "ipsum" },
];
const val2 = [
    { id: "id1", i1prop1: "lorem", i4prop1: "ipsum" },
    { id: "id2", i1prop1: "lorem", i4prop1: "ipsum" },
];
fn1({
    param1: val1,
    param2: val2,
    param3: "i1prop1",
});

```


</details>


<details><summary><b>Compiler Options</b></summary>

```json
{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "strictBindCallApply": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "useDefineForClassFields": false,
    "alwaysStrict": true,
    "allowUnreachableCode": false,
    "allowUnusedLabels": false,
    "downlevelIteration": false,
    "noEmitHelpers": false,
    "noLib": false,
    "noStrictGenericChecks": false,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "esModuleInterop": true,
    "preserveConstEnums": false,
    "removeComments": false,
    "skipLibCheck": false,
    "checkJs": false,
    "allowJs": false,
    "declaration": true,
    "experimentalDecorators": false,
    "emitDecoratorMetadata": false,
    "target": "ES2017",
    "module": "ESNext"
  }
}
```
</details>