@@ -16584,7 +16584,7 @@ namespace ts {
16584
16584
let firstDefaultClause: CaseOrDefaultClause;
16585
16585
let hasDuplicateDefaultClause = false;
16586
16586
16587
- const expressionType = checkExpression(node.expression);
16587
+ let expressionType = checkExpression(node.expression);
16588
16588
forEach(node.caseBlock.clauses, clause => {
16589
16589
// Grammar check for duplicate default clauses, skip if we already report duplicate default clause
16590
16590
if (clause.kind === SyntaxKind.DefaultClause && !hasDuplicateDefaultClause) {
@@ -16605,7 +16605,13 @@ namespace ts {
16605
16605
// TypeScript 1.0 spec (April 2014): 5.9
16606
16606
// In a 'switch' statement, each 'case' expression must be of a type that is comparable
16607
16607
// 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
+ }
16609
16615
if (!isTypeEqualityComparableTo(expressionType, caseType)) {
16610
16616
// expressionType is not comparable to caseType, try the reversed check and report errors if it fails
16611
16617
checkTypeComparableTo(caseType, expressionType, caseClause.expression, /*headMessage*/ undefined);
0 commit comments