Closed
Description
assuming my understanding it right: an extended union is a subset (subtype) of the original union
declare function never(never: never): never;
type X = 'A' | 'B' | 'C';
void function fn<Y extends X>(y: Y): Y {
switch (y) {
case 'A': return y;
case 'B': return y;
case 'C': return y;
default: return never(y); // <-- y expected to be never, actual Y
}
}
same problem with objects
type X = { k: 'A' } | { k: 'B' } | { k: 'C' };
void function fn<Y extends X>(y: Y): Y {
switch (y.k) {
case 'A': return y;
case 'B': return y;
case 'C': return y;
default: return never(y); // <-- y expected to be never, actual Y
}
}