Skip to content

Commit 70e2c43

Browse files
committed
Consider null, undefined, and void to be unit types in type guards
1 parent e14fe5b commit 70e2c43

1 file changed

Lines changed: 18 additions & 14 deletions

File tree

src/compiler/checker.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6865,19 +6865,16 @@ namespace ts {
68656865
type.flags & TypeFlags.Enum && type.symbol.flags & SymbolFlags.EnumMember ? true : false;
68666866
}
68676867

6868-
function isLiteralUnionType(type: Type): boolean {
6869-
return type.flags & TypeFlags.Literal ? true :
6870-
type.flags & TypeFlags.Enum ? (type.symbol.flags & SymbolFlags.EnumMember) !== 0 :
6871-
type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isLiteralUnionType) :
6872-
false;
6868+
function isUnitUnionType(type: Type): boolean {
6869+
return type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isUnitType) : isUnitType(type);
68736870
}
68746871

6875-
function getBaseTypeOfLiteralType(type: Type): Type {
6872+
function getBaseTypeOfUnitType(type: Type): Type {
68766873
return type.flags & TypeFlags.StringLiteral ? stringType :
68776874
type.flags & TypeFlags.NumberLiteral ? numberType :
68786875
type.flags & TypeFlags.BooleanLiteral ? booleanType :
68796876
type.flags & TypeFlags.Enum && type.symbol.flags & SymbolFlags.EnumMember ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)) :
6880-
type.flags & TypeFlags.Union ? getUnionType(map((<UnionType>type).types, getBaseTypeOfLiteralType)) :
6877+
type.flags & TypeFlags.Union ? getUnionType(map((<UnionType>type).types, getBaseTypeOfUnitType)) :
68816878
type;
68826879
}
68836880

@@ -8123,7 +8120,7 @@ namespace ts {
81238120
}
81248121

81258122
function narrowTypeBySwitchOnDiscriminant(type: Type, switchStatement: SwitchStatement, clauseStart: number, clauseEnd: number) {
8126-
if (!isLiteralUnionType(type)) {
8123+
if (!isUnitUnionType(type)) {
81278124
return type;
81288125
}
81298126
const switchTypes = getSwitchClauseTypes(switchStatement);
@@ -11970,7 +11967,7 @@ namespace ts {
1197011967
return false;
1197111968
}
1197211969
const type = checkExpression(node.expression);
11973-
if (!isLiteralUnionType(type)) {
11970+
if (!isUnitUnionType(type)) {
1197411971
return false;
1197511972
}
1197611973
const switchTypes = getSwitchClauseTypes(node);
@@ -12690,11 +12687,11 @@ namespace ts {
1269012687
case SyntaxKind.ExclamationEqualsToken:
1269112688
case SyntaxKind.EqualsEqualsEqualsToken:
1269212689
case SyntaxKind.ExclamationEqualsEqualsToken:
12693-
const leftIsLiteral = isLiteralUnionType(leftType);
12694-
const rightIsLiteral = isLiteralUnionType(rightType);
12695-
if (!leftIsLiteral || !rightIsLiteral) {
12696-
leftType = leftIsLiteral ? getBaseTypeOfLiteralType(leftType) : leftType;
12697-
rightType = rightIsLiteral ? getBaseTypeOfLiteralType(rightType) : rightType;
12690+
const leftIsUnit = isUnitUnionType(leftType);
12691+
const rightIsUnit = isUnitUnionType(rightType);
12692+
if (!leftIsUnit || !rightIsUnit) {
12693+
leftType = leftIsUnit ? getBaseTypeOfUnitType(leftType) : leftType;
12694+
rightType = rightIsUnit ? getBaseTypeOfUnitType(rightType) : rightType;
1269812695
}
1269912696
if (!isTypeEqualityComparableTo(leftType, rightType) && !isTypeEqualityComparableTo(rightType, leftType)) {
1270012697
reportOperatorError();
@@ -12836,6 +12833,13 @@ namespace ts {
1283612833
return getUnionType([type1, type2]);
1283712834
}
1283812835

12836+
function isLiteralUnionType(type: Type): boolean {
12837+
return type.flags & TypeFlags.Literal ? true :
12838+
type.flags & TypeFlags.Enum ? (type.symbol.flags & SymbolFlags.EnumMember) !== 0 :
12839+
type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isLiteralUnionType) :
12840+
false;
12841+
}
12842+
1283912843
function isLiteralTypeContext(node: Expression) {
1284012844
return isLiteralTypeLocation(node) || isLiteralUnionType(getContextualType(node) || unknownType);
1284112845
}

0 commit comments

Comments
 (0)