Skip to content

Adding parentheses changes the result of type inference #56270

Closed
@Max10240

Description

@Max10240

🔎 Search Terms

"constraint evaluation", "type infer"

🕗 Version & Regression Information

  • This changed between versions 4.9 and 5.0

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

type PositiveInfinity = 1e999;
type NegativeInfinity = -1e999;

export type IsEqual<A, B> =
	(<G>() => G extends A ? 1 : 2) extends
	(<G>() => G extends B ? 1 : 2)
		? true
		: false;


export type Add<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 ([R[0], R[3]]) // Note: with parentheses
		? PositiveInfinity
		: 'failed'
	: never;

export type AddWithoutParentheses<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 [R[0], R[3]] // Note: without parentheses
		? PositiveInfinity
		: 'failed'
	: never;


type AddTest0 = Add<PositiveInfinity, PositiveInfinity>; // failed
type AddTest1 = AddWithoutParentheses<PositiveInfinity, PositiveInfinity>; // in version 5.x: "Infinity"; but in version 4.x, it's "failed"

🙁 Actual behavior

type AddTest0 = Add<PositiveInfinity, PositiveInfinity>; // "failed" (both in version 4.x and 5.x, it is)
type AddTest1 = AddWithoutParentheses<PositiveInfinity, PositiveInfinity>; // "Infinity" in version 5.x; but in version 4.x, it's "failed"

🙂 Expected behavior

// Better be able to do:
type AddTest0 = Add<PositiveInfinity, PositiveInfinity>; // Infinity (both in version 4.x and 5.x)
type AddTest1 = AddWithoutParentheses<PositiveInfinity, PositiveInfinity>; // Infinity (both in version 4.x and 5.x)


// at least:
type AddTest0 = Add<PositiveInfinity, PositiveInfinity>; // failed (both in version 4.x and 5.x)
type AddTest1 = AddWithoutParentheses<PositiveInfinity, PositiveInfinity>; // failed (both in version 4.x and 5.x)

Additional information about the issue

see also: #51090

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions