@@ -6946,12 +6946,12 @@ namespace ts {
6946
6946
}
6947
6947
6948
6948
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) ||
6950
6950
type.flags & TypeFlags.Enum && type.symbol.flags & SymbolFlags.EnumMember ? true : false;
6951
6951
}
6952
6952
6953
6953
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);
6955
6955
}
6956
6956
6957
6957
function getBaseTypeOfUnitType(type: Type): Type {
@@ -8209,9 +8209,7 @@ namespace ts {
8209
8209
}
8210
8210
8211
8211
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
8215
8213
const switchTypes = getSwitchClauseTypes(switchStatement);
8216
8214
if (!switchTypes.length) {
8217
8215
return type;
@@ -8223,7 +8221,7 @@ namespace ts {
8223
8221
if (!hasDefaultClause) {
8224
8222
return caseType;
8225
8223
}
8226
- const defaultType = filterType(type, t => !eachTypeContainedIn(t, switchTypes));
8224
+ const defaultType = filterType(type, t => !(isUnitType(t) && contains( switchTypes, t) ));
8227
8225
return caseType === neverType ? defaultType : getUnionType([caseType, defaultType]);
8228
8226
}
8229
8227
0 commit comments