Skip to content

Commit d63bc8d

Browse files
committed
Suppress error during getTypeOfExpression
1 parent 0bfc9f5 commit d63bc8d

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

src/compiler/checker.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,7 @@ export const enum CheckMode {
12581258
RestBindingElement = 1 << 6, // Checking a type that is going to be used to determine the type of a rest binding element
12591259
// e.g. in `const { a, ...rest } = foo`, when checking the type of `foo` to determine the type of `rest`,
12601260
// we need to preserve generic types instead of substituting them for constraints
1261+
TypeOnly = 1 << 7, // Called from getTypeOfExpression, diagnostics may be omitted
12611262
}
12621263

12631264
/** @internal */
@@ -36753,7 +36754,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3675336754
const rightType = getLastResult(state);
3675436755
Debug.assertIsDefined(rightType);
3675536756

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);
3675736758
}
3675836759

3675936760
state.skip = false;
@@ -36824,7 +36825,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3682436825
}
3682536826

3682636827
const rightType = checkExpression(right, checkMode);
36827-
return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode);
36828+
return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, checkMode, errorNode);
3682836829
}
3682936830

3683036831
function checkBinaryLikeExpressionWorker(
@@ -36833,6 +36834,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3683336834
right: Expression,
3683436835
leftType: Type,
3683536836
rightType: Type,
36837+
checkMode?: CheckMode,
3683636838
errorNode?: Node
3683736839
): Type {
3683836840
const operator = operatorToken.kind;
@@ -36986,14 +36988,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3698636988
case SyntaxKind.ExclamationEqualsToken:
3698736989
case SyntaxKind.EqualsEqualsEqualsToken:
3698836990
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));
3699236998
}
36993-
checkNaNEquality(errorNode, operator, left, right);
36994-
reportOperatorErrorUnless((left, right) => isTypeEqualityComparableTo(left, right) || isTypeEqualityComparableTo(right, left));
3699536999
return booleanType;
36996-
3699737000
case SyntaxKind.InstanceOfKeyword:
3699837001
return checkInstanceOfExpression(left, right, leftType, rightType);
3699937002
case SyntaxKind.InKeyword:
@@ -37348,7 +37351,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3734837351
}
3734937352

3735037353
function checkConditionalExpression(node: ConditionalExpression, checkMode?: CheckMode): Type {
37351-
const type = checkTruthinessExpression(node.condition);
37354+
const type = checkTruthinessExpression(node.condition, checkMode);
3735237355
checkTestingKnownTruthyCallableOrAwaitableType(node.condition, type, node.whenTrue);
3735337356
const type1 = checkExpression(node.whenTrue, checkMode);
3735437357
const type2 = checkExpression(node.whenFalse, checkMode);
@@ -37729,7 +37732,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3772937732
}
3773037733
}
3773137734
const startInvocationCount = flowInvocationCount;
37732-
const type = checkExpression(node);
37735+
const type = checkExpression(node, CheckMode.TypeOnly);
3773337736
// If control flow analysis was required to determine the type, it is worth caching.
3773437737
if (flowInvocationCount !== startInvocationCount) {
3773537738
const cache = flowTypeCache || (flowTypeCache = []);

0 commit comments

Comments
 (0)