diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 10700204010..6cb9e395f18 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -951,11 +951,10 @@ namespace ts { if (!expression) { return flags & FlowFlags.TrueCondition ? antecedent : unreachableFlow; } - if (expression.kind === SyntaxKind.TrueKeyword && flags & FlowFlags.FalseCondition || - expression.kind === SyntaxKind.FalseKeyword && flags & FlowFlags.TrueCondition) { - if (!isExpressionOfOptionalChainRoot(expression)) { - return unreachableFlow; - } + if ((expression.kind === SyntaxKind.TrueKeyword && flags & FlowFlags.FalseCondition || + expression.kind === SyntaxKind.FalseKeyword && flags & FlowFlags.TrueCondition) && + !isExpressionOfOptionalChainRoot(expression) && !isQuestionQuestionExpression(expression.parent)) { + return unreachableFlow; } if (!isNarrowingExpression(expression)) { return antecedent; diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index e86f79b360a..7c85f169b72 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -5953,6 +5953,10 @@ namespace ts { return isOptionalChainRoot(node.parent) && node.parent.expression === node; } + export function isQuestionQuestionExpression(node: Node) { + return node.kind === SyntaxKind.BinaryExpression && (node).operatorToken.kind === SyntaxKind.QuestionQuestionToken; + } + export function isNewExpression(node: Node): node is NewExpression { return node.kind === SyntaxKind.NewExpression; }