Skip to content

Commit 9f22bad

Browse files
committed
Use TypeFlags.Never to check for 'never' type
1 parent b7d1d11 commit 9f22bad

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

src/compiler/checker.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8071,7 +8071,7 @@ namespace ts {
80718071
function getAssignmentReducedType(declaredType: UnionType, assignedType: Type) {
80728072
if (declaredType !== assignedType) {
80738073
const reducedType = filterType(declaredType, t => typeMaybeAssignableTo(assignedType, t));
8074-
if (reducedType !== neverType) {
8074+
if (!(reducedType.flags & TypeFlags.Never)) {
80758075
return reducedType;
80768076
}
80778077
}
@@ -8351,7 +8351,7 @@ namespace ts {
83518351
const visitedFlowStart = visitedFlowCount;
83528352
const result = getTypeFromFlowType(getTypeAtFlowNode(reference.flowNode));
83538353
visitedFlowCount = visitedFlowStart;
8354-
if (reference.parent.kind === SyntaxKind.NonNullExpression && getTypeWithFacts(result, TypeFacts.NEUndefinedOrNull) === neverType) {
8354+
if (reference.parent.kind === SyntaxKind.NonNullExpression && getTypeWithFacts(result, TypeFacts.NEUndefinedOrNull).flags & TypeFlags.Never) {
83558355
return declaredType;
83568356
}
83578357
return result;
@@ -8440,7 +8440,7 @@ namespace ts {
84408440
function getTypeAtFlowCondition(flow: FlowCondition): FlowType {
84418441
const flowType = getTypeAtFlowNode(flow.antecedent);
84428442
let type = getTypeFromFlowType(flowType);
8443-
if (type !== neverType) {
8443+
if (!(type.flags & TypeFlags.Never)) {
84448444
// If we have an antecedent type (meaning we're reachable in some way), we first
84458445
// attempt to narrow the antecedent type. If that produces the never type, and if
84468446
// the antecedent type is incomplete (i.e. a transient type in a loop), then we
@@ -8449,7 +8449,7 @@ namespace ts {
84498449
// narrow that.
84508450
const assumeTrue = (flow.flags & FlowFlags.TrueCondition) !== 0;
84518451
type = narrowType(type, flow.expression, assumeTrue);
8452-
if (type === neverType && isIncomplete(flowType)) {
8452+
if (type.flags & TypeFlags.Never && isIncomplete(flowType)) {
84538453
type = narrowType(declaredType, flow.expression, assumeTrue);
84548454
}
84558455
}
@@ -8659,7 +8659,7 @@ namespace ts {
86598659
}
86608660
if (assumeTrue) {
86618661
const narrowedType = filterType(type, t => areTypesComparable(t, valueType));
8662-
return narrowedType !== neverType ? narrowedType : type;
8662+
return narrowedType.flags & TypeFlags.Never ? type : narrowedType;
86638663
}
86648664
return isUnitType(valueType) ? filterType(type, t => t !== valueType) : type;
86658665
}
@@ -8702,12 +8702,12 @@ namespace ts {
87028702
const clauseTypes = switchTypes.slice(clauseStart, clauseEnd);
87038703
const hasDefaultClause = clauseStart === clauseEnd || contains(clauseTypes, neverType);
87048704
const discriminantType = getUnionType(clauseTypes);
8705-
const caseType = discriminantType === neverType ? neverType : filterType(type, t => isTypeComparableTo(discriminantType, t));
8705+
const caseType = discriminantType.flags & TypeFlags.Never ? neverType : filterType(type, t => isTypeComparableTo(discriminantType, t));
87068706
if (!hasDefaultClause) {
87078707
return caseType;
87088708
}
87098709
const defaultType = filterType(type, t => !(isUnitType(t) && contains(switchTypes, t)));
8710-
return caseType === neverType ? defaultType : getUnionType([caseType, defaultType]);
8710+
return caseType.flags & TypeFlags.Never ? defaultType : getUnionType([caseType, defaultType]);
87118711
}
87128712

87138713
function narrowTypeByInstanceof(type: Type, expr: BinaryExpression, assumeTrue: boolean): Type {
@@ -8771,7 +8771,7 @@ namespace ts {
87718771
// the candidate type. If one or more constituents remain, return a union of those.
87728772
if (type.flags & TypeFlags.Union) {
87738773
const assignableType = filterType(type, t => isTypeInstanceOf(t, candidate));
8774-
if (assignableType !== neverType) {
8774+
if (!(assignableType.flags & TypeFlags.Never)) {
87758775
return assignableType;
87768776
}
87778777
}
@@ -12718,7 +12718,7 @@ namespace ts {
1271812718
// the native Promise<T> type by the caller.
1271912719
type = checkAwaitedType(type, func, Diagnostics.Return_expression_in_async_function_does_not_have_a_valid_callable_then_member);
1272012720
}
12721-
if (type === neverType) {
12721+
if (type.flags & TypeFlags.Never) {
1272212722
hasReturnOfTypeNever = true;
1272312723
}
1272412724
else if (!contains(aggregatedTypes, type)) {
@@ -12768,7 +12768,7 @@ namespace ts {
1276812768

1276912769
const hasExplicitReturn = func.flags & NodeFlags.HasExplicitReturn;
1277012770

12771-
if (returnType === neverType) {
12771+
if (returnType && returnType.flags & TypeFlags.Never) {
1277212772
error(func.type, Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point);
1277312773
}
1277412774
else if (returnType && !hasExplicitReturn) {
@@ -16265,7 +16265,7 @@ namespace ts {
1626516265

1626616266
// Now that we've removed all the StringLike types, if no constituents remain, then the entire
1626716267
// arrayOrStringType was a string.
16268-
if (arrayType === neverType) {
16268+
if (arrayType.flags & TypeFlags.Never) {
1626916269
return stringType;
1627016270
}
1627116271
}
@@ -16326,7 +16326,7 @@ namespace ts {
1632616326
if (func) {
1632716327
const signature = getSignatureFromDeclaration(func);
1632816328
const returnType = getReturnTypeOfSignature(signature);
16329-
if (strictNullChecks || node.expression || returnType === neverType) {
16329+
if (strictNullChecks || node.expression || returnType.flags & TypeFlags.Never) {
1633016330
const exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType;
1633116331

1633216332
if (func.asteriskToken) {

0 commit comments

Comments
 (0)