Raise literal type to its base in a comparison

Similar to ===, except that it always applies, even when comparing two
literals.
This commit is contained in:
Nathan Shively-Sanders
2016-11-10 14:29:48 -08:00
parent 6e1aac1c42
commit e301cfe58c
4 changed files with 91 additions and 0 deletions

View File

@@ -14241,6 +14241,8 @@ namespace ts {
case SyntaxKind.LessThanEqualsToken:
case SyntaxKind.GreaterThanEqualsToken:
if (checkForDisallowedESSymbolOperand(operator)) {
leftType = getBaseTypeOfLiteralType(leftType);
rightType = getBaseTypeOfLiteralType(rightType);
if (!isTypeComparableTo(leftType, rightType) && !isTypeComparableTo(rightType, leftType)) {
reportOperatorError();
}

View File

@@ -0,0 +1,40 @@
tests/cases/compiler/relationalOperatorComparable.ts(5,14): error TS2365: Operator '<' cannot be applied to types 'number' and 'boolean'.
tests/cases/compiler/relationalOperatorComparable.ts(6,14): error TS2365: Operator '<=' cannot be applied to types 'number' and 'boolean'.
tests/cases/compiler/relationalOperatorComparable.ts(7,14): error TS2365: Operator '>=' cannot be applied to types 'number' and 'boolean'.
tests/cases/compiler/relationalOperatorComparable.ts(8,14): error TS2365: Operator '>' cannot be applied to types 'number' and 'boolean'.
tests/cases/compiler/relationalOperatorComparable.ts(9,14): error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
tests/cases/compiler/relationalOperatorComparable.ts(10,14): error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
tests/cases/compiler/relationalOperatorComparable.ts(11,14): error TS2365: Operator '<' cannot be applied to types 'string' and 'number'.
==== tests/cases/compiler/relationalOperatorComparable.ts (7 errors) ====
function f(onethree: 1 | 3, two: 2) {
const t = true;
const f = false;
let a1 = onethree < two; // ok
let a2 = onethree < true; // error, number and boolean
~~~~~~~~~~~~~~~
!!! error TS2365: Operator '<' cannot be applied to types 'number' and 'boolean'.
let a3 = onethree <= false; // error, number and boolean
~~~~~~~~~~~~~~~~~
!!! error TS2365: Operator '<=' cannot be applied to types 'number' and 'boolean'.
let a4 = onethree >= t; // error, number and boolean
~~~~~~~~~~~~~
!!! error TS2365: Operator '>=' cannot be applied to types 'number' and 'boolean'.
let a5 = onethree > f; // error, number and boolean
~~~~~~~~~~~~
!!! error TS2365: Operator '>' cannot be applied to types 'number' and 'boolean'.
let a6 = true < onethree; // error, boolean and number
~~~~~~~~~~~~~~~
!!! error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
let a7 = false < two; // error, boolean and number
~~~~~~~~~~~
!!! error TS2365: Operator '<' cannot be applied to types 'boolean' and 'number'.
let a8 = 'foo' < onethree; // error, string and number
~~~~~~~~~~~~~~~~
!!! error TS2365: Operator '<' cannot be applied to types 'string' and 'number'.
let a9 = onethree < 1; // ok
let a10 = 1 < two; // ok
let a11 = 2 < 1; // ok
}

View File

@@ -0,0 +1,34 @@
//// [relationalOperatorComparable.ts]
function f(onethree: 1 | 3, two: 2) {
const t = true;
const f = false;
let a1 = onethree < two; // ok
let a2 = onethree < true; // error, number and boolean
let a3 = onethree <= false; // error, number and boolean
let a4 = onethree >= t; // error, number and boolean
let a5 = onethree > f; // error, number and boolean
let a6 = true < onethree; // error, boolean and number
let a7 = false < two; // error, boolean and number
let a8 = 'foo' < onethree; // error, string and number
let a9 = onethree < 1; // ok
let a10 = 1 < two; // ok
let a11 = 2 < 1; // ok
}
//// [relationalOperatorComparable.js]
function f(onethree, two) {
var t = true;
var f = false;
var a1 = onethree < two; // ok
var a2 = onethree < true; // error, number and boolean
var a3 = onethree <= false; // error, number and boolean
var a4 = onethree >= t; // error, number and boolean
var a5 = onethree > f; // error, number and boolean
var a6 = true < onethree; // error, boolean and number
var a7 = false < two; // error, boolean and number
var a8 = 'foo' < onethree; // error, string and number
var a9 = onethree < 1; // ok
var a10 = 1 < two; // ok
var a11 = 2 < 1; // ok
}

View File

@@ -0,0 +1,15 @@
function f(onethree: 1 | 3, two: 2) {
const t = true;
const f = false;
let a1 = onethree < two; // ok
let a2 = onethree < true; // error, number and boolean
let a3 = onethree <= false; // error, number and boolean
let a4 = onethree >= t; // error, number and boolean
let a5 = onethree > f; // error, number and boolean
let a6 = true < onethree; // error, boolean and number
let a7 = false < two; // error, boolean and number
let a8 = 'foo' < onethree; // error, string and number
let a9 = onethree < 1; // ok
let a10 = 1 < two; // ok
let a11 = 2 < 1; // ok
}