Repository: TypeScript
Issue: Uncomputed generic type does not follow structural typing
Labels: Bug,Rescheduled

# Bug Report

<!--
  Please fill in each section completely. Thank you!
-->

### 🔎 Search Terms

<!--
  What search terms did you use when trying to find an existing bug report?
  List them here so people in the future can find this one more easily.
-->
generic
unassignable type
uncomputed type

### 🕗 Version & Regression Information

<!-- When did you start seeing this bug occur?

"Bugs" that have existed in TS for a long time are very likely to be FAQs; refer to
  https://github.com/Microsoft/TypeScript/wiki/FAQ#common-bugs-that-arent-bugs

If possible, please try testing the nightly version of TS to see if it's already been fixed.
For npm: `typescript@next`
This is also the 'Nightly' version in the playground: http://www.typescriptlang.org/play/?ts=Nightly

Note: The TypeScript Playground can be used to try older versions of TypeScript.

Please keep and fill in the line that best applies:
-->
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about:
  - [Common "Bugs" That Aren't Bugs](https://github.com/Microsoft/TypeScript/wiki/FAQ#common-bugs-that-arent-bugs)
  - [Type System Behavior](https://github.com/Microsoft/TypeScript/wiki/FAQ#type-system-behavior)
  - [Generics](https://github.com/Microsoft/TypeScript/wiki/FAQ#generics)

### ⏯ Playground Link

<!--
  A link to a TypeScript Playground "Share" link which shows this behavior

  The TypeScript Workbench can be used for more complex setups, try
  https://www.typescriptlang.org/dev/bug-workbench/

  As a last resort, you can link to a repo, but these will be slower for us to investigate.
-->
[Playground link with relevant code](https://www.typescriptlang.org/play?pretty=true&ts=4.8.4#code/MYGwhgzhAECC0G8CwAoa7oA8Bc0IBcAnASwDsBzaAXmgHJZaBuVDaAT11IFcBbAIwCmhatAAMzFAF9UqUJBgAhRCww48RMpRq0FTFegBeuPgHsTIAWFIiiXAROkpU+NgAcB0ACoAeABrQBTHwBUgATGAQsXCs2aEkAPhEABWJgAGs-ABo6TFp4iWc3DwBhER9YfML3aAARMu8FSqcUF2rigH1A4LCIdrqaUq6Q8NroAH5oWw9cADMwEAh7VmWV1bXWAHoNycI7Ko8U9NhOoOHew7SlGgvvWGzaXMShnugbhXvH8Z27aFn5xcYm22U32XmOz3C7U8Vy8tyepxePkaXymv2gcwWS3W2JWW3R-w8AAoxgBKGQoUICOSEDwWfDQMC4cpNSnU2kCel8JkNFlU8A06B06DAXDFCSs-ns+mhXA1AooPgiMCA5Z4oSEEzCAAWQiJpNkIlCjCAA)

### 💻 Code

<!-- Please post the relevant code sample here as well-->
```ts
class A {
    x: string = 'A';
    y: number = 0;
}

class B {
    x: string = 'B';
    z: boolean = true;
}

type T<X extends { x: any }> = Pick<X, 'x'>;

type C = T<A>;
type D = T<B>;

type C_extends_D = C extends D ? true : false;                                  // true
type PickA_extends_PickB = Pick<A, 'x'> extends Pick<B, 'x'> ? true : false;    // true
type TA_extends_TB = T<A> extends T<B> ? true : false;                          // false (?)

declare let a: T<A>;
declare let b: T<B>;
declare let c: C;
declare let d: D;

b = a;      // error here (?)
c = d;
```

### 🙁 Actual behavior

- Type `TA_extends_TB` is `false`.
- `a` is not assignable to `b`.

### 🙂 Expected behavior

- All types `TA_extends_TB` should be `true`, the same way as `C_extends_D` and `PickA_extends_PickB`.
- `a` should be assignable to `b` and vice-versa, the same way as `c` and `d`.