Skip to content

Commit 280b27e

Browse files
committed
Narrowing doesn't require switch expression to be unit type
1 parent 5225997 commit 280b27e

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6946,12 +6946,12 @@ namespace ts {
69466946
}
69476947

69486948
function isUnitType(type: Type): boolean {
6949-
return type.flags & (TypeFlags.Literal | TypeFlags.Void | TypeFlags.Undefined | TypeFlags.Null) ||
6949+
return type.flags & (TypeFlags.Literal | TypeFlags.Undefined | TypeFlags.Null) ||
69506950
type.flags & TypeFlags.Enum && type.symbol.flags & SymbolFlags.EnumMember ? true : false;
69516951
}
69526952

69536953
function isUnitUnionType(type: Type): boolean {
6954-
return type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isUnitType) : isUnitType(type);
6954+
return type.flags & TypeFlags.Union ? !forEach((<UnionType>type).types, t => !isUnitType(t)) : isUnitType(type);
69556955
}
69566956

69576957
function getBaseTypeOfUnitType(type: Type): Type {
@@ -8209,9 +8209,7 @@ namespace ts {
82098209
}
82108210

82118211
function narrowTypeBySwitchOnDiscriminant(type: Type, switchStatement: SwitchStatement, clauseStart: number, clauseEnd: number) {
8212-
if (!isUnitUnionType(type)) {
8213-
return type;
8214-
}
8212+
// We only narrow if all case expressions specify values with unit types
82158213
const switchTypes = getSwitchClauseTypes(switchStatement);
82168214
if (!switchTypes.length) {
82178215
return type;
@@ -8223,7 +8221,7 @@ namespace ts {
82238221
if (!hasDefaultClause) {
82248222
return caseType;
82258223
}
8226-
const defaultType = filterType(type, t => !eachTypeContainedIn(t, switchTypes));
8224+
const defaultType = filterType(type, t => !(isUnitType(t) && contains(switchTypes, t)));
82278225
return caseType === neverType ? defaultType : getUnionType([caseType, defaultType]);
82288226
}
82298227

0 commit comments

Comments
 (0)