Skip to content

Commit 7497d81

Browse files
committed
Narrow string and number types in equality checks and switch cases
1 parent 4ccb3bb commit 7497d81

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8791,6 +8791,10 @@ namespace ts {
87918791
assumeTrue ? TypeFacts.EQUndefined : TypeFacts.NEUndefined;
87928792
return getTypeWithFacts(type, facts);
87938793
}
8794+
if (type.flags & TypeFlags.String && isTypeOfKind(valueType, TypeFlags.StringLiteral) ||
8795+
type.flags & TypeFlags.Number && isTypeOfKind(valueType, TypeFlags.NumberLiteral)) {
8796+
return assumeTrue? valueType : type;
8797+
}
87948798
if (type.flags & TypeFlags.NotUnionOrUnit) {
87958799
return type;
87968800
}
@@ -8843,7 +8847,11 @@ namespace ts {
88438847
const clauseTypes = switchTypes.slice(clauseStart, clauseEnd);
88448848
const hasDefaultClause = clauseStart === clauseEnd || contains(clauseTypes, neverType);
88458849
const discriminantType = getUnionType(clauseTypes);
8846-
const caseType = discriminantType.flags & TypeFlags.Never ? neverType : filterType(type, t => isTypeComparableTo(discriminantType, t));
8850+
const caseType =
8851+
discriminantType.flags & TypeFlags.Never ? neverType :
8852+
type.flags & TypeFlags.String && isTypeOfKind(discriminantType, TypeFlags.StringLiteral) ? discriminantType :
8853+
type.flags & TypeFlags.Number && isTypeOfKind(discriminantType, TypeFlags.NumberLiteral) ? discriminantType :
8854+
filterType(type, t => isTypeComparableTo(discriminantType, t));
88478855
if (!hasDefaultClause) {
88488856
return caseType;
88498857
}

0 commit comments

Comments
 (0)