Repository: TypeScript
Issue: strictFunctionTypes prevents an assignment not related to functions
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.3.0-dev.20181122

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:**
covariance, contravariance, keyof, interface, class, generic

**Code**

```ts
interface IBase {
    foo: string;
}

interface IDerived extends IBase {
    bar: string;
}

type StringPropertyNames<T> = { [P in keyof T]: T[P] extends string ? P : never }[keyof T]
type StringProperties<T> = Pick<T, StringPropertyNames<T>>

interface Foo<T> {
    readonly Bar: StringProperties<T>;
}

let baseProperties: StringProperties<IBase>
let derivedProperties: StringProperties<IDerived>

let baseInterface: Foo<IBase>
let derivedInterface: Foo<IDerived>

baseProperties = derivedProperties // no error
baseInterface = derivedInterface
```

`tsc test.ts --strictFunctionTypes`

**Expected behavior:**
Compiles without errors.

**Actual behavior:**
```
test.ts:23:1 - error TS2322: Type 'Foo<IDerived>' is not assignable to type 'Foo<IBase>'.
  Property 'bar' is missing in type 'IBase' but required in type 'IDerived'.

23 baseInterface = derivedInterface
   ~~~~~~~~~~~~~

  test.ts:6:5
    6     bar: string;
          ~~~
    'bar' is declared here.
```

[**Playground Link:**](https://www.typescriptlang.org/play/#src=interface%20IBase%20%7B%0D%0A%20%20%20%20foo%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20IDerived%20extends%20IBase%20%7B%0D%0A%20%20%20%20bar%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Atype%20StringPropertyNames<T>%20%3D%20%7B%20%5BP%20in%20keyof%20T%5D%3A%20T%5BP%5D%20extends%20string%20%3F%20P%20%3A%20never%20%7D%5Bkeyof%20T%5D%0D%0Atype%20StringProperties<T>%20%3D%20Pick<T%2C%20StringPropertyNames<T>>%0D%0A%0D%0Ainterface%20Foo<T>%20%7B%0D%0A%20%20%20%20readonly%20Bar%3A%20StringProperties<T>%3B%0D%0A%7D%0D%0A%0D%0Alet%20baseProperties%3A%20StringProperties<IBase>%0D%0Alet%20derivedProperties%3A%20StringProperties<IDerived>%0D%0A%0D%0Alet%20baseInterface%3A%20Foo<IBase>%0D%0Alet%20derivedInterface%3A%20Foo<IDerived>%0D%0A%0D%0AbaseProperties%20%3D%20derivedProperties%20%2F%2F%20no%20error%0D%0AbaseInterface%20%3D%20derivedInterface%0D%0A) <!-- A link to a TypeScript Playground "Share" link which demonstrates this behavior -->

**Related Issues:** <!-- Did you find other bugs that looked similar? -->
#24190

The [documentation says](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html):
> Under --strictFunctionTypes function type parameter positions are checked contravariantly instead of bivariantly. 

I couldn't find any information saying it should affect anything else.