Repository: TypeScript
Issue: Incorrect inference of arrow function with intersected mapped type argument under strictFunctionTypes
Labels: Needs Investigation

<!-- Please try to reproduce the issue with `typescript@next`. It may have already been fixed. -->
**TypeScript Version:**  3.6.0-dev.20190801

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:** `inference` `intersection type` `strictFunctionTypes`

**Code**

```ts
type MappedIntersection<T extends {}> = { [P in keyof T]: string } & {};
type MappedRaw<T extends {}> = { [P in keyof T]: string };

// Case 1: Intersection + no arrow = succeed
type ToInferNoArrowIntersection<T extends {}> = {
    fn(params: MappedIntersection<T>): void;
};

type NoArrowIntersection<T extends ToInferNoArrowIntersection<any>> = void;
declare const case1: NoArrowIntersection<{
    fn: (params: MappedIntersection<{a: 1}>) => string,
}>;


// Case 2: No intersection + arrow = succeed
type ToInferArrowNoIntersection<T extends {}> = {
    fn: (params: MappedRaw<T>) => void;
};

type ArrowNoIntersection<T extends ToInferArrowNoIntersection<any>> = void;
declare const case2: ArrowNoIntersection<{
    fn: (params: MappedRaw<{a: 1}>) => void,
}>;


// Case 3: Intersection + arrow = fail
type ToInferArrowIntersection<T extends {}> = {
    fn: (params: MappedIntersection<T>) => void;
};

type ArrowIntersection<T extends ToInferArrowIntersection<any>> = void;
declare const case3: ArrowIntersection<{ // Fails here
    fn: (params: MappedIntersection<{a: 1}>) => void,
}>;
```

**Expected behavior:**
Expected case 3 to succeed.

**Actual behavior:**
Case 3 produces:
```
 Type '{ fn: (params: { a: string; }) => void; }' does not satisfy the constraint 'ToInferArrowIntersection<any>'.
  Types of property 'fn' are incompatible.
    Type '(params: { a: string; }) => void' is not assignable to type '(params: { [x: string]: string; }) => void'.
      Types of parameters 'params' and 'params' are incompatible.
        Property 'a' is missing in type '{ [x: string]: string; }' but required in type '{ a: string; }'.
```
Seems relevant that compilation succeeds without `strictFunctionTypes`


**Playground Link:** [Playground](https://www.typescriptlang.org/play/#code/C4TwDgpgBAsghmSATAkgO2BATgZwgY2AEsB7NAHgBUoIAPTNJHKAbwF8A+KAXlagG0AClCJooAawggSAMyiUAugC4oOYFlEBzKGygAyVmwDcAKFCRYCZACU4Adyo16ERs3ZdeLAcNESps+WVVdS0dUxMAegioAGE4PCgARhV0TFwCYjIoAGooNBIoOCwsEjseVQBXfHwICCQzcGhKEnQZbAA5EgBBYtLU7DxCUgpqOgYmQw9WEyhZqBk0AAowIrgAWxwVeEQ6-vShsioOAEoVADcSIiRTYxMGi06ekrs9wcyRp3HmZtaO7t6XhgBhlhuQ4GgQBwphcrqYkAQADZFaD4MhqKD4eIQZJQR4A14gw4sGZzBYqZarDZbKy7IH7d7kFhwFSJTjHHhcNQaNCaAA0Jk44Ui0TiCQATCpOiI6W9hjlCgDyjgqjU6vcmi00G0sE9Sp0CQcPmMXBN3OViXN5mhySssOtNpYdkhbA5KCcOVAYdcBeFzNBdXZ9TLCUbnK55JrtQGg2lZYdwZDoZdvfD8EisCi0cAMViJVBo5rYyHGSTZmSoBS7VTHTZ7IzmUk2R6vfzBXdhbEsVAAMwpYOG+VFZ7lGRwIgI9UR346-H9hmjMOmzjm0tWm2Uh3bZAG+fu7hcL03X2NfOzouGxzG8M-LXYAM70EJqHlQ8mVPpzNodGYvC90-PB8iVXctK3taknUAigmRZJt909ZNWw4UwgA)


**Related Issues:** <!-- Did you find other bugs that looked similar? -->
https://github.com/microsoft/TypeScript/issues/29123#issuecomment-453884098
https://github.com/microsoft/TypeScript/issues/31081