-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Adding parentheses changes the result of type inference #56270
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
The original PR that made the non-parenthesized version to work can be found here: #52091 |
This is working as intended, though I agree it is a bit surprising. We gramatically check for conditional types of the pattern We specifically don't first erase parentheses because that is just one of untold number of ways you could write a type that turns out to be a tuple type. The tuple types are in a sense immaterial (when they match on both sides they are effectively erased), but we want the explicit matching brackets on both sides to be the signal that this type is non-distributive. |
Won't this mean that running a formatter which removes or adds parens will change behavior? |
It does mean that - it happened to me just today when I was playing with this ;p |
I feel like unwrapping parens is a good idea exactly for that reason. Formatters frequently unparen or reparen expressions depending on their position and complexity. They won't add or remove other syntax, though, so I don't think we're breaking into the realm of the other ways to make a tuple type by handling it. |
export type AddWithInfer<A extends number, B extends number> = [
IsEqual<A, PositiveInfinity>, IsEqual<A, NegativeInfinity>,
IsEqual<B, PositiveInfinity>, IsEqual<B, NegativeInfinity>,
] extends infer R extends [boolean, boolean, boolean, boolean]
? [true, false] extends (infer _ extends ([R[0], R[3]])) // Note: with infer
? PositiveInfinity
: 'failed'
: never;
type AddTest2 = AddWithInfer<PositiveInfinity, PositiveInfinity>; // Infinity, works too! @ahejlsberg So using "infer" makes it work, because "infer" leads to something like that( |
🔎 Search Terms
"constraint evaluation", "type infer"
🕗 Version & Regression Information
In Version 5.x, parentheses changes the result of type inference;
In Version 4.9 - 4.7(The minimum version that supports
infer X extends ...
), parentheses not changes the result of type inference;⏯ Playground Link
playground link
💻 Code
🙁 Actual behavior
🙂 Expected behavior
Additional information about the issue
see also: #51090
The text was updated successfully, but these errors were encountered: