@@ -1258,6 +1258,7 @@ export const enum CheckMode {
1258
1258
RestBindingElement = 1 << 6, // Checking a type that is going to be used to determine the type of a rest binding element
1259
1259
// e.g. in `const { a, ...rest } = foo`, when checking the type of `foo` to determine the type of `rest`,
1260
1260
// we need to preserve generic types instead of substituting them for constraints
1261
+ TypeOnly = 1 << 7, // Called from getTypeOfExpression, diagnostics may be omitted
1261
1262
}
1262
1263
1263
1264
/** @internal */
@@ -36753,7 +36754,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
36753
36754
const rightType = getLastResult(state);
36754
36755
Debug.assertIsDefined(rightType);
36755
36756
36756
- result = checkBinaryLikeExpressionWorker(node.left, node.operatorToken, node.right, leftType, rightType, node);
36757
+ result = checkBinaryLikeExpressionWorker(node.left, node.operatorToken, node.right, leftType, rightType, state.checkMode, node);
36757
36758
}
36758
36759
36759
36760
state.skip = false;
@@ -36824,7 +36825,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
36824
36825
}
36825
36826
36826
36827
const rightType = checkExpression(right, checkMode);
36827
- return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode);
36828
+ return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, checkMode, errorNode);
36828
36829
}
36829
36830
36830
36831
function checkBinaryLikeExpressionWorker(
@@ -36833,6 +36834,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
36833
36834
right: Expression,
36834
36835
leftType: Type,
36835
36836
rightType: Type,
36837
+ checkMode?: CheckMode,
36836
36838
errorNode?: Node
36837
36839
): Type {
36838
36840
const operator = operatorToken.kind;
@@ -36986,14 +36988,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
36986
36988
case SyntaxKind.ExclamationEqualsToken:
36987
36989
case SyntaxKind.EqualsEqualsEqualsToken:
36988
36990
case SyntaxKind.ExclamationEqualsEqualsToken:
36989
- if (isLiteralExpressionOfObject(left) || isLiteralExpressionOfObject(right)) {
36990
- const eqType = operator === SyntaxKind.EqualsEqualsToken || operator === SyntaxKind.EqualsEqualsEqualsToken;
36991
- error(errorNode, Diagnostics.This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value, eqType ? "false" : "true");
36991
+ if (!(checkMode && checkMode & CheckMode.TypeOnly)) {
36992
+ if (isLiteralExpressionOfObject(left) || isLiteralExpressionOfObject(right)) {
36993
+ const eqType = operator === SyntaxKind.EqualsEqualsToken || operator === SyntaxKind.EqualsEqualsEqualsToken;
36994
+ error(errorNode, Diagnostics.This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value, eqType ? "false" : "true");
36995
+ }
36996
+ checkNaNEquality(errorNode, operator, left, right);
36997
+ reportOperatorErrorUnless((left, right) => isTypeEqualityComparableTo(left, right) || isTypeEqualityComparableTo(right, left));
36992
36998
}
36993
- checkNaNEquality(errorNode, operator, left, right);
36994
- reportOperatorErrorUnless((left, right) => isTypeEqualityComparableTo(left, right) || isTypeEqualityComparableTo(right, left));
36995
36999
return booleanType;
36996
-
36997
37000
case SyntaxKind.InstanceOfKeyword:
36998
37001
return checkInstanceOfExpression(left, right, leftType, rightType);
36999
37002
case SyntaxKind.InKeyword:
@@ -37348,7 +37351,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37348
37351
}
37349
37352
37350
37353
function checkConditionalExpression(node: ConditionalExpression, checkMode?: CheckMode): Type {
37351
- const type = checkTruthinessExpression(node.condition);
37354
+ const type = checkTruthinessExpression(node.condition, checkMode );
37352
37355
checkTestingKnownTruthyCallableOrAwaitableType(node.condition, type, node.whenTrue);
37353
37356
const type1 = checkExpression(node.whenTrue, checkMode);
37354
37357
const type2 = checkExpression(node.whenFalse, checkMode);
@@ -37729,7 +37732,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37729
37732
}
37730
37733
}
37731
37734
const startInvocationCount = flowInvocationCount;
37732
- const type = checkExpression(node);
37735
+ const type = checkExpression(node, CheckMode.TypeOnly );
37733
37736
// If control flow analysis was required to determine the type, it is worth caching.
37734
37737
if (flowInvocationCount !== startInvocationCount) {
37735
37738
const cache = flowTypeCache || (flowTypeCache = []);
0 commit comments