-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Description
TypeScript Version: 3.1.6, 3.2.1, the current playground (3.3?), and next as of Feb 28
Search Terms:
conditional types are incorrectly
Code
interface A { foo(); }
interface B { bar(); }
function test1<T extends A>(x: T, y: T extends B ? number : string) {
if (typeof y == 'string') {
y;
} else {
y; // never ?
}
const newY: string | number = y;
newY; // just string
}
function test2<T extends A>(x: T, y: T extends B ? string : number) {
if (typeof y == 'string') {
y; // never ?
} else {
y;
}
const newY: string | number = y;
newY; // just number
}Expected behavior:
T extends B ? string : number should either be left unchanged, or rounded up to string|number: I think the issue stems from incorrect inference that T extends B is false given T extends A (while they're just unrelated interfaces that have a non-empty intersection). The test case below is as far as I've managed to reduce the problem.
Actual behavior:
The T extends A constraint seems to make TS guess T extends B is always false, and so the a?b:c type behaves as c.
Playground Link: (playground)
Related Issues:
#29939 looks slightly similar, but I don't see the same constraints when playing around with my example, so I'm not sure it's the same.