You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Describe the bug
In the code below, all occurrences of v1 and v2 are inferred as string | undefined but in fact they should be string because the undefined cases are already handled.
constgetOptionalString: ()=>string|undefined=()=>Math.random()>5 ? undefined : 'foo';constvalue=match([getOptionalString(),getOptionalString()]).with([undefined,undefined],()=>0).with([P.select(),undefined],(v1)=>1)// BAD: v1 is inferred as string|undefined but should be just string.with([undefined,P.select()],(v2)=>2).otherwise(([v1,v2])=>3);
In fact, it works if the pattern is a single value instead of a tuple:
constvalue=match(getOptionalString()).with(undefined,()=>0).otherwise((v)=>1);// GOOD: v is inferred as string without undefined
This behavior is expected. In order to support this we would need to distribute unions in the input type even without using .exhaustive() and this is pretty expensive in terms of type checking time.
See the discussion in issue #145 for some additional context on how type narrowing and exhaustive work in ts-pattern
Describe the bug
In the code below, all occurrences of
v1
andv2
are inferred asstring | undefined
but in fact they should bestring
because the undefined cases are already handled.In fact, it works if the pattern is a single value instead of a tuple:
Code Sandbox with a minimal reproduction case
https://codesandbox.io/p/sandbox/crazy-galileo-3zsfmh
Versions
The text was updated successfully, but these errors were encountered: