Repository: TypeScript
Issue: Assignability rule for conditional types needs to require check types and distributivity to be identical
Labels: Suggestion,Experimentation Needed

<!-- 🚨 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:**  master (e4718564e5b2c1f2e7bbef27fc480fd8172dfdc0)

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:** assignable assignability conditional type check type checkType distributive distributivity identical unsound

**Code**
```ts
type MyElement<A> = [A] extends [[infer E]] ? E : never;
function oops<A, B extends A>(arg: MyElement<A>): MyElement<B> { 
    return arg;  // compiles OK, expected compile error
}
oops<[number | string], [string]>(42).slice();  // runtime error

type MyAcceptor<A> = [A] extends [[infer E]] ? (arg: E) => void : never;
function oops2<A, B extends A>(arg: MyAcceptor<B>): MyAcceptor<A> { 
    return arg;  // compiles OK, expected compile error
}
oops2<[number | string], [string]>((arg) => arg.slice())(42);  // runtime error

type Dist<T> = T extends number ? number : string; 
type Aux<A extends { a: unknown }> = A["a"] extends number ? number : string;
type Nondist<T> = Aux<{a: T}>;
function oops3<T>(arg: Dist<T>): Nondist<T> {
    return arg;  // compiles OK, expected compile error
}
oops3<number | string>(42).slice();  // runtime error
```

**Expected behavior:** Compile errors as marked.

**Actual behavior:** Compiles OK, runtime errors as marked.

**Playground Link:** [link](https://www.typescriptlang.org/play/#src=type%20MyElement%3CA%3E%20%3D%20%5BA%5D%20extends%20%5B%5Binfer%20E%5D%5D%20%3F%20E%20%3A%20never%3B%0D%0Afunction%20oops%3CA%2C%20B%20extends%20A%3E(arg%3A%20MyElement%3CA%3E)%3A%20MyElement%3CB%3E%20%7B%20%0D%0A%20%20%20%20return%20arg%3B%20%20%2F%2F%20compiles%20OK%2C%20expected%20compile%20error%0D%0A%7D%0D%0Aoops%3C%5Bnumber%20%7C%20string%5D%2C%20%5Bstring%5D%3E(42).slice()%3B%20%20%2F%2F%20runtime%20error%0D%0A%0D%0Atype%20MyAcceptor%3CA%3E%20%3D%20%5BA%5D%20extends%20%5B%5Binfer%20E%5D%5D%20%3F%20(arg%3A%20E)%20%3D%3E%20void%20%3A%20never%3B%0D%0Afunction%20oops2%3CA%2C%20B%20extends%20A%3E(arg%3A%20MyAcceptor%3CB%3E)%3A%20MyAcceptor%3CA%3E%20%7B%20%0D%0A%20%20%20%20return%20arg%3B%20%20%2F%2F%20compiles%20OK%2C%20expected%20compile%20error%0D%0A%7D%0D%0Aoops2%3C%5Bnumber%20%7C%20string%5D%2C%20%5Bstring%5D%3E((arg)%20%3D%3E%20arg.slice())(42)%3B%20%20%2F%2F%20runtime%20error%0D%0A%0D%0Atype%20Dist%3CT%3E%20%3D%20T%20extends%20number%20%3F%20number%20%3A%20string%3B%20%0D%0Atype%20Aux%3CA%20extends%20%7B%20a%3A%20unknown%20%7D%3E%20%3D%20A%5B%22a%22%5D%20extends%20number%20%3F%20number%20%3A%20string%3B%0D%0Atype%20Nondist%3CT%3E%20%3D%20Aux%3C%7Ba%3A%20T%7D%3E%3B%0D%0Afunction%20oops3%3CT%3E(arg%3A%20Dist%3CT%3E)%3A%20Nondist%3CT%3E%20%7B%0D%0A%20%20%20%20return%20arg%3B%20%20%2F%2F%20compiles%20OK%2C%20expected%20compile%20error%0D%0A%7D%0D%0Aoops3%3Cnumber%20%7C%20string%3E(42).slice()%3B%20%20%2F%2F%20runtime%20error)

**Related Issues:** None found