@@ -132,6 +132,7 @@ namespace ts {
132
132
const esSymbolType = createIntrinsicType(TypeFlags.ESSymbol, "symbol");
133
133
const voidType = createIntrinsicType(TypeFlags.Void, "void");
134
134
const neverType = createIntrinsicType(TypeFlags.Never, "never");
135
+ const silentNeverType = createIntrinsicType(TypeFlags.Never, "never");
135
136
136
137
const emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
137
138
const emptyGenericType = <GenericType><ObjectType>createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
@@ -147,6 +148,7 @@ namespace ts {
147
148
const anySignature = createSignature(undefined, undefined, undefined, emptyArray, anyType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
148
149
const unknownSignature = createSignature(undefined, undefined, undefined, emptyArray, unknownType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
149
150
const resolvingSignature = createSignature(undefined, undefined, undefined, emptyArray, anyType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
151
+ const silentNeverSignature = createSignature(undefined, undefined, undefined, emptyArray, silentNeverType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
150
152
151
153
const enumNumberIndexInfo = createIndexInfo(stringType, /*isReadonly*/ true);
152
154
@@ -6504,6 +6506,9 @@ namespace ts {
6504
6506
} else if (source.symbol && source.flags & TypeFlags.ObjectType && globalObjectType === source) {
6505
6507
reportError(Diagnostics.The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead);
6506
6508
}
6509
+ else if (source.symbol && source.flags & TypeFlags.ObjectType && globalObjectType === source) {
6510
+ reportError(Diagnostics.The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead);
6511
+ }
6507
6512
reportRelationError(headMessage, source, target);
6508
6513
}
6509
6514
return Ternary.False;
@@ -8072,8 +8077,11 @@ namespace ts {
8072
8077
// we remove type string.
8073
8078
function getAssignmentReducedType(declaredType: UnionType, assignedType: Type) {
8074
8079
if (declaredType !== assignedType) {
8080
+ if (assignedType.flags & TypeFlags.Never) {
8081
+ return assignedType;
8082
+ }
8075
8083
const reducedType = filterType(declaredType, t => typeMaybeAssignableTo(assignedType, t));
8076
- if (reducedType !== neverType ) {
8084
+ if (!( reducedType.flags & TypeFlags.Never) ) {
8077
8085
return reducedType;
8078
8086
}
8079
8087
}
@@ -8353,7 +8361,7 @@ namespace ts {
8353
8361
const visitedFlowStart = visitedFlowCount;
8354
8362
const result = getTypeFromFlowType(getTypeAtFlowNode(reference.flowNode));
8355
8363
visitedFlowCount = visitedFlowStart;
8356
- if (reference.parent.kind === SyntaxKind.NonNullExpression && getTypeWithFacts(result, TypeFacts.NEUndefinedOrNull) === neverType ) {
8364
+ if (reference.parent.kind === SyntaxKind.NonNullExpression && getTypeWithFacts(result, TypeFacts.NEUndefinedOrNull).flags & TypeFlags.Never ) {
8357
8365
return declaredType;
8358
8366
}
8359
8367
return result;
@@ -8442,17 +8450,18 @@ namespace ts {
8442
8450
function getTypeAtFlowCondition(flow: FlowCondition): FlowType {
8443
8451
const flowType = getTypeAtFlowNode(flow.antecedent);
8444
8452
let type = getTypeFromFlowType(flowType);
8445
- if (type !== neverType ) {
8453
+ if (!( type.flags & TypeFlags.Never) ) {
8446
8454
// If we have an antecedent type (meaning we're reachable in some way), we first
8447
8455
// attempt to narrow the antecedent type. If that produces the never type, and if
8448
8456
// the antecedent type is incomplete (i.e. a transient type in a loop), then we
8449
8457
// take the type guard as an indication that control *could* reach here once we
8450
- // have the complete type. We proceed by reverting to the declared type and then
8451
- // narrow that.
8458
+ // have the complete type. We proceed by switching to the silent never type which
8459
+ // doesn't report errors when operators are applied to it. Note that this is the
8460
+ // *only* place a silent never type is ever generated.
8452
8461
const assumeTrue = (flow.flags & FlowFlags.TrueCondition) !== 0;
8453
8462
type = narrowType(type, flow.expression, assumeTrue);
8454
- if (type === neverType && isIncomplete(flowType)) {
8455
- type = narrowType(declaredType, flow.expression, assumeTrue) ;
8463
+ if (type.flags & TypeFlags.Never && isIncomplete(flowType)) {
8464
+ type = silentNeverType ;
8456
8465
}
8457
8466
}
8458
8467
return createFlowType(type, isIncomplete(flowType));
@@ -8661,7 +8670,7 @@ namespace ts {
8661
8670
}
8662
8671
if (assumeTrue) {
8663
8672
const narrowedType = filterType(type, t => areTypesComparable(t, valueType));
8664
- return narrowedType !== neverType ? narrowedType : type ;
8673
+ return narrowedType.flags & TypeFlags.Never ? type : narrowedType ;
8665
8674
}
8666
8675
return isUnitType(valueType) ? filterType(type, t => t !== valueType) : type;
8667
8676
}
@@ -8704,12 +8713,12 @@ namespace ts {
8704
8713
const clauseTypes = switchTypes.slice(clauseStart, clauseEnd);
8705
8714
const hasDefaultClause = clauseStart === clauseEnd || contains(clauseTypes, neverType);
8706
8715
const discriminantType = getUnionType(clauseTypes);
8707
- const caseType = discriminantType === neverType ? neverType : filterType(type, t => isTypeComparableTo(discriminantType, t));
8716
+ const caseType = discriminantType.flags & TypeFlags.Never ? neverType : filterType(type, t => isTypeComparableTo(discriminantType, t));
8708
8717
if (!hasDefaultClause) {
8709
8718
return caseType;
8710
8719
}
8711
8720
const defaultType = filterType(type, t => !(isUnitType(t) && contains(switchTypes, t)));
8712
- return caseType === neverType ? defaultType : getUnionType([caseType, defaultType]);
8721
+ return caseType.flags & TypeFlags.Never ? defaultType : getUnionType([caseType, defaultType]);
8713
8722
}
8714
8723
8715
8724
function narrowTypeByInstanceof(type: Type, expr: BinaryExpression, assumeTrue: boolean): Type {
@@ -8773,7 +8782,7 @@ namespace ts {
8773
8782
// the candidate type. If one or more constituents remain, return a union of those.
8774
8783
if (type.flags & TypeFlags.Union) {
8775
8784
const assignableType = filterType(type, t => isTypeInstanceOf(t, candidate));
8776
- if (assignableType !== neverType ) {
8785
+ if (!( assignableType.flags & TypeFlags.Never) ) {
8777
8786
return assignableType;
8778
8787
}
8779
8788
}
@@ -10891,7 +10900,7 @@ namespace ts {
10891
10900
10892
10901
function checkPropertyAccessExpressionOrQualifiedName(node: PropertyAccessExpression | QualifiedName, left: Expression | QualifiedName, right: Identifier) {
10893
10902
const type = checkNonNullExpression(left);
10894
- if (isTypeAny(type)) {
10903
+ if (isTypeAny(type) || type === silentNeverType ) {
10895
10904
return type;
10896
10905
}
10897
10906
@@ -11038,8 +11047,8 @@ namespace ts {
11038
11047
const objectType = getApparentType(checkNonNullExpression(node.expression));
11039
11048
const indexType = node.argumentExpression ? checkExpression(node.argumentExpression) : unknownType;
11040
11049
11041
- if (objectType === unknownType) {
11042
- return unknownType ;
11050
+ if (objectType === unknownType || objectType === silentNeverType ) {
11051
+ return objectType ;
11043
11052
}
11044
11053
11045
11054
const isConstEnum = isConstEnumObjectType(objectType);
@@ -12089,6 +12098,9 @@ namespace ts {
12089
12098
}
12090
12099
12091
12100
const funcType = checkNonNullExpression(node.expression);
12101
+ if (funcType === silentNeverType) {
12102
+ return silentNeverSignature;
12103
+ }
12092
12104
const apparentType = getApparentType(funcType);
12093
12105
12094
12106
if (apparentType === unknownType) {
@@ -12161,6 +12173,9 @@ namespace ts {
12161
12173
}
12162
12174
12163
12175
let expressionType = checkNonNullExpression(node.expression);
12176
+ if (expressionType === silentNeverType) {
12177
+ return silentNeverSignature;
12178
+ }
12164
12179
12165
12180
// If expressionType's apparent type(section 3.8.1) is an object type with one or
12166
12181
// more construct signatures, the expression is processed in the same manner as a
@@ -12720,7 +12735,7 @@ namespace ts {
12720
12735
// the native Promise<T> type by the caller.
12721
12736
type = checkAwaitedType(type, func, Diagnostics.Return_expression_in_async_function_does_not_have_a_valid_callable_then_member);
12722
12737
}
12723
- if (type === neverType ) {
12738
+ if (type.flags & TypeFlags.Never ) {
12724
12739
hasReturnOfTypeNever = true;
12725
12740
}
12726
12741
else if (!contains(aggregatedTypes, type)) {
@@ -12770,7 +12785,7 @@ namespace ts {
12770
12785
12771
12786
const hasExplicitReturn = func.flags & NodeFlags.HasExplicitReturn;
12772
12787
12773
- if (returnType === neverType ) {
12788
+ if (returnType && returnType.flags & TypeFlags.Never ) {
12774
12789
error(func.type, Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point);
12775
12790
}
12776
12791
else if (returnType && !hasExplicitReturn) {
@@ -13026,6 +13041,9 @@ namespace ts {
13026
13041
13027
13042
function checkPrefixUnaryExpression(node: PrefixUnaryExpression): Type {
13028
13043
const operandType = checkExpression(node.operand);
13044
+ if (operandType === silentNeverType) {
13045
+ return silentNeverType;
13046
+ }
13029
13047
if (node.operator === SyntaxKind.MinusToken && node.operand.kind === SyntaxKind.NumericLiteral) {
13030
13048
return getLiteralTypeForText(TypeFlags.NumberLiteral, "" + -(<LiteralExpression>node.operand).text);
13031
13049
}
@@ -13059,6 +13077,9 @@ namespace ts {
13059
13077
13060
13078
function checkPostfixUnaryExpression(node: PostfixUnaryExpression): Type {
13061
13079
const operandType = checkExpression(node.operand);
13080
+ if (operandType === silentNeverType) {
13081
+ return silentNeverType;
13082
+ }
13062
13083
const ok = checkArithmeticOperandType(node.operand, getNonNullableType(operandType),
13063
13084
Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
13064
13085
if (ok) {
@@ -13123,6 +13144,9 @@ namespace ts {
13123
13144
}
13124
13145
13125
13146
function checkInstanceOfExpression(left: Expression, right: Expression, leftType: Type, rightType: Type): Type {
13147
+ if (leftType === silentNeverType || rightType === silentNeverType) {
13148
+ return silentNeverType;
13149
+ }
13126
13150
// TypeScript 1.0 spec (April 2014): 4.15.4
13127
13151
// The instanceof operator requires the left operand to be of type Any, an object type, or a type parameter type,
13128
13152
// and the right operand to be of type Any or a subtype of the 'Function' interface type.
@@ -13139,6 +13163,9 @@ namespace ts {
13139
13163
}
13140
13164
13141
13165
function checkInExpression(left: Expression, right: Expression, leftType: Type, rightType: Type): Type {
13166
+ if (leftType === silentNeverType || rightType === silentNeverType) {
13167
+ return silentNeverType;
13168
+ }
13142
13169
// TypeScript 1.0 spec (April 2014): 4.15.5
13143
13170
// The in operator requires the left operand to be of type Any, the String primitive type, or the Number primitive type,
13144
13171
// and the right operand to be of type Any, an object type, or a type parameter type.
@@ -13403,6 +13430,9 @@ namespace ts {
13403
13430
case SyntaxKind.CaretEqualsToken:
13404
13431
case SyntaxKind.AmpersandToken:
13405
13432
case SyntaxKind.AmpersandEqualsToken:
13433
+ if (leftType === silentNeverType || rightType === silentNeverType) {
13434
+ return silentNeverType;
13435
+ }
13406
13436
// TypeScript 1.0 spec (April 2014): 4.19.1
13407
13437
// These operators require their operands to be of type Any, the Number primitive type,
13408
13438
// or an enum type. Operands of an enum type are treated
@@ -13435,6 +13465,9 @@ namespace ts {
13435
13465
return numberType;
13436
13466
case SyntaxKind.PlusToken:
13437
13467
case SyntaxKind.PlusEqualsToken:
13468
+ if (leftType === silentNeverType || rightType === silentNeverType) {
13469
+ return silentNeverType;
13470
+ }
13438
13471
// TypeScript 1.0 spec (April 2014): 4.19.2
13439
13472
// The binary + operator requires both operands to be of the Number primitive type or an enum type,
13440
13473
// or at least one of the operands to be of type Any or the String primitive type.
@@ -16267,7 +16300,7 @@ namespace ts {
16267
16300
16268
16301
// Now that we've removed all the StringLike types, if no constituents remain, then the entire
16269
16302
// arrayOrStringType was a string.
16270
- if (arrayType === neverType ) {
16303
+ if (arrayType.flags & TypeFlags.Never ) {
16271
16304
return stringType;
16272
16305
}
16273
16306
}
@@ -16328,7 +16361,7 @@ namespace ts {
16328
16361
if (func) {
16329
16362
const signature = getSignatureFromDeclaration(func);
16330
16363
const returnType = getReturnTypeOfSignature(signature);
16331
- if (strictNullChecks || node.expression || returnType === neverType ) {
16364
+ if (strictNullChecks || node.expression || returnType.flags & TypeFlags.Never ) {
16332
16365
const exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType;
16333
16366
16334
16367
if (func.asteriskToken) {
0 commit comments