Skip to content

Commit 00ebf59

Browse files
committed
Use same literal comparison rules for switch/===
switch was missing the rule for converting literal types to the literal base type if needed.
1 parent 31a55e6 commit 00ebf59

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16584,7 +16584,7 @@ namespace ts {
1658416584
let firstDefaultClause: CaseOrDefaultClause;
1658516585
let hasDuplicateDefaultClause = false;
1658616586

16587-
const expressionType = checkExpression(node.expression);
16587+
let expressionType = checkExpression(node.expression);
1658816588
forEach(node.caseBlock.clauses, clause => {
1658916589
// Grammar check for duplicate default clauses, skip if we already report duplicate default clause
1659016590
if (clause.kind === SyntaxKind.DefaultClause && !hasDuplicateDefaultClause) {
@@ -16605,7 +16605,13 @@ namespace ts {
1660516605
// TypeScript 1.0 spec (April 2014): 5.9
1660616606
// In a 'switch' statement, each 'case' expression must be of a type that is comparable
1660716607
// to or from the type of the 'switch' expression.
16608-
const caseType = checkExpression(caseClause.expression);
16608+
let caseType = checkExpression(caseClause.expression);
16609+
const expressionIsLiteral = isLiteralType(expressionType);
16610+
const caseIsLiteral = isLiteralType(caseType);
16611+
if (!expressionIsLiteral || !caseIsLiteral) {
16612+
expressionType = expressionIsLiteral ? getBaseTypeOfLiteralType(expressionType) : expressionType;
16613+
caseType = caseIsLiteral ? getBaseTypeOfLiteralType(caseType) : caseType;
16614+
}
1660916615
if (!isTypeEqualityComparableTo(expressionType, caseType)) {
1661016616
// expressionType is not comparable to caseType, try the reversed check and report errors if it fails
1661116617
checkTypeComparableTo(caseType, expressionType, caseClause.expression, /*headMessage*/ undefined);

0 commit comments

Comments
 (0)