@@ -8071,7 +8071,7 @@ namespace ts {
8071
8071
function getAssignmentReducedType(declaredType: UnionType, assignedType: Type) {
8072
8072
if (declaredType !== assignedType) {
8073
8073
const reducedType = filterType(declaredType, t => typeMaybeAssignableTo(assignedType, t));
8074
- if (reducedType !== neverType ) {
8074
+ if (!( reducedType.flags & TypeFlags.Never) ) {
8075
8075
return reducedType;
8076
8076
}
8077
8077
}
@@ -8351,7 +8351,7 @@ namespace ts {
8351
8351
const visitedFlowStart = visitedFlowCount;
8352
8352
const result = getTypeFromFlowType(getTypeAtFlowNode(reference.flowNode));
8353
8353
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 ) {
8355
8355
return declaredType;
8356
8356
}
8357
8357
return result;
@@ -8440,7 +8440,7 @@ namespace ts {
8440
8440
function getTypeAtFlowCondition(flow: FlowCondition): FlowType {
8441
8441
const flowType = getTypeAtFlowNode(flow.antecedent);
8442
8442
let type = getTypeFromFlowType(flowType);
8443
- if (type !== neverType ) {
8443
+ if (!( type.flags & TypeFlags.Never) ) {
8444
8444
// If we have an antecedent type (meaning we're reachable in some way), we first
8445
8445
// attempt to narrow the antecedent type. If that produces the never type, and if
8446
8446
// the antecedent type is incomplete (i.e. a transient type in a loop), then we
@@ -8449,7 +8449,7 @@ namespace ts {
8449
8449
// narrow that.
8450
8450
const assumeTrue = (flow.flags & FlowFlags.TrueCondition) !== 0;
8451
8451
type = narrowType(type, flow.expression, assumeTrue);
8452
- if (type === neverType && isIncomplete(flowType)) {
8452
+ if (type.flags & TypeFlags.Never && isIncomplete(flowType)) {
8453
8453
type = narrowType(declaredType, flow.expression, assumeTrue);
8454
8454
}
8455
8455
}
@@ -8659,7 +8659,7 @@ namespace ts {
8659
8659
}
8660
8660
if (assumeTrue) {
8661
8661
const narrowedType = filterType(type, t => areTypesComparable(t, valueType));
8662
- return narrowedType !== neverType ? narrowedType : type ;
8662
+ return narrowedType.flags & TypeFlags.Never ? type : narrowedType ;
8663
8663
}
8664
8664
return isUnitType(valueType) ? filterType(type, t => t !== valueType) : type;
8665
8665
}
@@ -8702,12 +8702,12 @@ namespace ts {
8702
8702
const clauseTypes = switchTypes.slice(clauseStart, clauseEnd);
8703
8703
const hasDefaultClause = clauseStart === clauseEnd || contains(clauseTypes, neverType);
8704
8704
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));
8706
8706
if (!hasDefaultClause) {
8707
8707
return caseType;
8708
8708
}
8709
8709
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]);
8711
8711
}
8712
8712
8713
8713
function narrowTypeByInstanceof(type: Type, expr: BinaryExpression, assumeTrue: boolean): Type {
@@ -8771,7 +8771,7 @@ namespace ts {
8771
8771
// the candidate type. If one or more constituents remain, return a union of those.
8772
8772
if (type.flags & TypeFlags.Union) {
8773
8773
const assignableType = filterType(type, t => isTypeInstanceOf(t, candidate));
8774
- if (assignableType !== neverType ) {
8774
+ if (!( assignableType.flags & TypeFlags.Never) ) {
8775
8775
return assignableType;
8776
8776
}
8777
8777
}
@@ -12718,7 +12718,7 @@ namespace ts {
12718
12718
// the native Promise<T> type by the caller.
12719
12719
type = checkAwaitedType(type, func, Diagnostics.Return_expression_in_async_function_does_not_have_a_valid_callable_then_member);
12720
12720
}
12721
- if (type === neverType ) {
12721
+ if (type.flags & TypeFlags.Never ) {
12722
12722
hasReturnOfTypeNever = true;
12723
12723
}
12724
12724
else if (!contains(aggregatedTypes, type)) {
@@ -12768,7 +12768,7 @@ namespace ts {
12768
12768
12769
12769
const hasExplicitReturn = func.flags & NodeFlags.HasExplicitReturn;
12770
12770
12771
- if (returnType === neverType ) {
12771
+ if (returnType && returnType.flags & TypeFlags.Never ) {
12772
12772
error(func.type, Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point);
12773
12773
}
12774
12774
else if (returnType && !hasExplicitReturn) {
@@ -16265,7 +16265,7 @@ namespace ts {
16265
16265
16266
16266
// Now that we've removed all the StringLike types, if no constituents remain, then the entire
16267
16267
// arrayOrStringType was a string.
16268
- if (arrayType === neverType ) {
16268
+ if (arrayType.flags & TypeFlags.Never ) {
16269
16269
return stringType;
16270
16270
}
16271
16271
}
@@ -16326,7 +16326,7 @@ namespace ts {
16326
16326
if (func) {
16327
16327
const signature = getSignatureFromDeclaration(func);
16328
16328
const returnType = getReturnTypeOfSignature(signature);
16329
- if (strictNullChecks || node.expression || returnType === neverType ) {
16329
+ if (strictNullChecks || node.expression || returnType.flags & TypeFlags.Never ) {
16330
16330
const exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType;
16331
16331
16332
16332
if (func.asteriskToken) {
0 commit comments