From 1c43baa6eba9605810afbffc0f252a16ee488a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 26 Jun 2022 16:22:05 +0200 Subject: [PATCH] Fixed a false positive related to binding patterns and spread expressions --- src/compiler/checker.ts | 3 ++- ...nWithinIIFEReturnAssignedtoPattern.symbols | 11 +++++++++ ...ionWithinIIFEReturnAssignedtoPattern.types | 23 +++++++++++++++++++ ...essionWithinIIFEReturnAssignedtoPattern.ts | 8 +++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.symbols create mode 100644 tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.types create mode 100644 tests/cases/compiler/spreadExpressionWithinIIFEReturnAssignedtoPattern.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a53c1841b6e..cf05c79e8e1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27970,7 +27970,8 @@ namespace ts { // type with those properties for which the binding pattern specifies a default value. // If the object literal is spread into another object literal, skip this step and let the top-level object // literal handle it instead. - if (contextualTypeHasPattern && node.parent.kind !== SyntaxKind.SpreadAssignment) { + const spreadOrOutsidePossibleObjectParent = findAncestor(node, n => n.kind === SyntaxKind.SpreadAssignment || isStatement(n) || isArrowFunction(n))!; + if (contextualTypeHasPattern && spreadOrOutsidePossibleObjectParent.kind !== SyntaxKind.SpreadAssignment) { for (const prop of getPropertiesOfType(contextualType)) { if (!propertiesTable.get(prop.escapedName) && !getPropertyOfType(spread, prop.escapedName)) { if (!(prop.flags & SymbolFlags.Optional)) { diff --git a/tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.symbols b/tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.symbols new file mode 100644 index 00000000000..92531907d8a --- /dev/null +++ b/tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/spreadExpressionWithinIIFEReturnAssignedtoPattern.ts === +// repro #49585 + +const { value } = (() => ({ +>value : Symbol(value, Decl(spreadExpressionWithinIIFEReturnAssignedtoPattern.ts, 2, 7)) + + value: "", +>value : Symbol(value, Decl(spreadExpressionWithinIIFEReturnAssignedtoPattern.ts, 2, 27)) + + ...(true ? {} : {}), +}))(); diff --git a/tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.types b/tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.types new file mode 100644 index 00000000000..dc56d0def76 --- /dev/null +++ b/tests/baselines/reference/spreadExpressionWithinIIFEReturnAssignedtoPattern.types @@ -0,0 +1,23 @@ +=== tests/cases/compiler/spreadExpressionWithinIIFEReturnAssignedtoPattern.ts === +// repro #49585 + +const { value } = (() => ({ +>value : string +>(() => ({ value: "", ...(true ? {} : {}),}))() : { value: string; } +>(() => ({ value: "", ...(true ? {} : {}),})) : () => { value: string; } +>() => ({ value: "", ...(true ? {} : {}),}) : () => { value: string; } +>({ value: "", ...(true ? {} : {}),}) : { value: string; } +>{ value: "", ...(true ? {} : {}),} : { value: string; } + + value: "", +>value : string +>"" : "" + + ...(true ? {} : {}), +>(true ? {} : {}) : {} +>true ? {} : {} : {} +>true : true +>{} : {} +>{} : {} + +}))(); diff --git a/tests/cases/compiler/spreadExpressionWithinIIFEReturnAssignedtoPattern.ts b/tests/cases/compiler/spreadExpressionWithinIIFEReturnAssignedtoPattern.ts new file mode 100644 index 00000000000..4652c802051 --- /dev/null +++ b/tests/cases/compiler/spreadExpressionWithinIIFEReturnAssignedtoPattern.ts @@ -0,0 +1,8 @@ +// @noEmit: true + +// repro #49585 + +const { value } = (() => ({ + value: "", + ...(true ? {} : {}), +}))(); \ No newline at end of file