Skip to content

Commit e301cfe

Browse files
committed
Raise literal type to its base in a comparison
Similar to ===, except that it always applies, even when comparing two literals.
1 parent 6e1aac1 commit e301cfe

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14241,6 +14241,8 @@ namespace ts {
1424114241
case SyntaxKind.LessThanEqualsToken:
1424214242
case SyntaxKind.GreaterThanEqualsToken:
1424314243
if (checkForDisallowedESSymbolOperand(operator)) {
14244+
leftType = getBaseTypeOfLiteralType(leftType);
14245+
rightType = getBaseTypeOfLiteralType(rightType);
1424414246
if (!isTypeComparableTo(leftType, rightType) && !isTypeComparableTo(rightType, leftType)) {
1424514247
reportOperatorError();
1424614248
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
tests/cases/compiler/relationalOperatorComparable.ts(5,14): error TS2365: Operator '<' cannot be applied to types 'number' and 'boolean'.
2+
tests/cases/compiler/relationalOperatorComparable.ts(6,14): error TS2365: Operator '<=' cannot be applied to types 'number' and 'boolean'.
3+
tests/cases/compiler/relationalOperatorComparable.ts(7,14): error TS2365: Operator '>=' cannot be applied to types 'number' and 'boolean'.
4+
tests/cases/compiler/relationalOperatorComparable.ts(8,14): error TS2365: Operator '>' cannot be applied to types 'number' and 'boolean'.
5+
tests/cases/compiler/relationalOperatorComparable.ts(9,14): error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
6+
tests/cases/compiler/relationalOperatorComparable.ts(10,14): error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
7+
tests/cases/compiler/relationalOperatorComparable.ts(11,14): error TS2365: Operator '<' cannot be applied to types 'string' and 'number'.
8+
9+
10+
==== tests/cases/compiler/relationalOperatorComparable.ts (7 errors) ====
11+
function f(onethree: 1 | 3, two: 2) {
12+
const t = true;
13+
const f = false;
14+
let a1 = onethree < two; // ok
15+
let a2 = onethree < true; // error, number and boolean
16+
~~~~~~~~~~~~~~~
17+
!!! error TS2365: Operator '<' cannot be applied to types 'number' and 'boolean'.
18+
let a3 = onethree <= false; // error, number and boolean
19+
~~~~~~~~~~~~~~~~~
20+
!!! error TS2365: Operator '<=' cannot be applied to types 'number' and 'boolean'.
21+
let a4 = onethree >= t; // error, number and boolean
22+
~~~~~~~~~~~~~
23+
!!! error TS2365: Operator '>=' cannot be applied to types 'number' and 'boolean'.
24+
let a5 = onethree > f; // error, number and boolean
25+
~~~~~~~~~~~~
26+
!!! error TS2365: Operator '>' cannot be applied to types 'number' and 'boolean'.
27+
let a6 = true < onethree; // error, boolean and number
28+
~~~~~~~~~~~~~~~
29+
!!! error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
30+
let a7 = false < two; // error, boolean and number
31+
~~~~~~~~~~~
32+
!!! error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
33+
let a8 = 'foo' < onethree; // error, string and number
34+
~~~~~~~~~~~~~~~~
35+
!!! error TS2365: Operator '<' cannot be applied to types 'string' and 'number'.
36+
let a9 = onethree < 1; // ok
37+
let a10 = 1 < two; // ok
38+
let a11 = 2 < 1; // ok
39+
}
40+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//// [relationalOperatorComparable.ts]
2+
function f(onethree: 1 | 3, two: 2) {
3+
const t = true;
4+
const f = false;
5+
let a1 = onethree < two; // ok
6+
let a2 = onethree < true; // error, number and boolean
7+
let a3 = onethree <= false; // error, number and boolean
8+
let a4 = onethree >= t; // error, number and boolean
9+
let a5 = onethree > f; // error, number and boolean
10+
let a6 = true < onethree; // error, boolean and number
11+
let a7 = false < two; // error, boolean and number
12+
let a8 = 'foo' < onethree; // error, string and number
13+
let a9 = onethree < 1; // ok
14+
let a10 = 1 < two; // ok
15+
let a11 = 2 < 1; // ok
16+
}
17+
18+
19+
//// [relationalOperatorComparable.js]
20+
function f(onethree, two) {
21+
var t = true;
22+
var f = false;
23+
var a1 = onethree < two; // ok
24+
var a2 = onethree < true; // error, number and boolean
25+
var a3 = onethree <= false; // error, number and boolean
26+
var a4 = onethree >= t; // error, number and boolean
27+
var a5 = onethree > f; // error, number and boolean
28+
var a6 = true < onethree; // error, boolean and number
29+
var a7 = false < two; // error, boolean and number
30+
var a8 = 'foo' < onethree; // error, string and number
31+
var a9 = onethree < 1; // ok
32+
var a10 = 1 < two; // ok
33+
var a11 = 2 < 1; // ok
34+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
function f(onethree: 1 | 3, two: 2) {
2+
const t = true;
3+
const f = false;
4+
let a1 = onethree < two; // ok
5+
let a2 = onethree < true; // error, number and boolean
6+
let a3 = onethree <= false; // error, number and boolean
7+
let a4 = onethree >= t; // error, number and boolean
8+
let a5 = onethree > f; // error, number and boolean
9+
let a6 = true < onethree; // error, boolean and number
10+
let a7 = false < two; // error, boolean and number
11+
let a8 = 'foo' < onethree; // error, string and number
12+
let a9 = onethree < 1; // ok
13+
let a10 = 1 < two; // ok
14+
let a11 = 2 < 1; // ok
15+
}

0 commit comments

Comments
 (0)