@@ -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