Description
openedon Feb 28, 2019
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.