From 6734eeb74b1e76cbd93875bdaf8c99b848f8ae0a Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Sun, 5 Sep 2021 10:03:09 +0300 Subject: [PATCH] fix(45692): merge non-primitive in spread-union --- src/compiler/checker.ts | 2 +- tests/baselines/reference/spreadUnion4.js | 20 +++++++++++++++++++ .../baselines/reference/spreadUnion4.symbols | 14 +++++++++++++ tests/baselines/reference/spreadUnion4.types | 15 ++++++++++++++ .../conformance/types/spread/spreadUnion4.ts | 4 ++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/spreadUnion4.js create mode 100644 tests/baselines/reference/spreadUnion4.symbols create mode 100644 tests/baselines/reference/spreadUnion4.types create mode 100644 tests/cases/conformance/types/spread/spreadUnion4.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 186422e5a90c0..8522a0605abe7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15600,7 +15600,7 @@ namespace ts { const declarations = concatenate(leftProp.declarations, rightProp.declarations); const flags = SymbolFlags.Property | (leftProp.flags & SymbolFlags.Optional); const result = createSymbol(flags, leftProp.escapedName); - result.type = getUnionType([getTypeOfSymbol(leftProp), removeMissingOrUndefinedType(rightType)]); + result.type = getUnionType([getTypeOfSymbol(leftProp), removeMissingOrUndefinedType(rightType)], UnionReduction.Subtype); result.leftSpread = leftProp; result.rightSpread = rightProp; result.declarations = declarations; diff --git a/tests/baselines/reference/spreadUnion4.js b/tests/baselines/reference/spreadUnion4.js new file mode 100644 index 0000000000000..9887c8e6f1794 --- /dev/null +++ b/tests/baselines/reference/spreadUnion4.js @@ -0,0 +1,20 @@ +//// [spreadUnion4.ts] +declare const a: { x: () => void } +declare const b: { x?: () => void } + +const c = { ...a, ...b }; + + +//// [spreadUnion4.js] +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var c = __assign(__assign({}, a), b); diff --git a/tests/baselines/reference/spreadUnion4.symbols b/tests/baselines/reference/spreadUnion4.symbols new file mode 100644 index 0000000000000..85f9071e31d9b --- /dev/null +++ b/tests/baselines/reference/spreadUnion4.symbols @@ -0,0 +1,14 @@ +=== tests/cases/conformance/types/spread/spreadUnion4.ts === +declare const a: { x: () => void } +>a : Symbol(a, Decl(spreadUnion4.ts, 0, 13)) +>x : Symbol(x, Decl(spreadUnion4.ts, 0, 18)) + +declare const b: { x?: () => void } +>b : Symbol(b, Decl(spreadUnion4.ts, 1, 13)) +>x : Symbol(x, Decl(spreadUnion4.ts, 1, 18)) + +const c = { ...a, ...b }; +>c : Symbol(c, Decl(spreadUnion4.ts, 3, 5)) +>a : Symbol(a, Decl(spreadUnion4.ts, 0, 13)) +>b : Symbol(b, Decl(spreadUnion4.ts, 1, 13)) + diff --git a/tests/baselines/reference/spreadUnion4.types b/tests/baselines/reference/spreadUnion4.types new file mode 100644 index 0000000000000..d3be34c89c70f --- /dev/null +++ b/tests/baselines/reference/spreadUnion4.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/types/spread/spreadUnion4.ts === +declare const a: { x: () => void } +>a : { x: () => void; } +>x : () => void + +declare const b: { x?: () => void } +>b : { x?: () => void; } +>x : () => void + +const c = { ...a, ...b }; +>c : { x: () => void; } +>{ ...a, ...b } : { x: () => void; } +>a : { x: () => void; } +>b : { x?: () => void; } + diff --git a/tests/cases/conformance/types/spread/spreadUnion4.ts b/tests/cases/conformance/types/spread/spreadUnion4.ts new file mode 100644 index 0000000000000..6a39ac3a3cc40 --- /dev/null +++ b/tests/cases/conformance/types/spread/spreadUnion4.ts @@ -0,0 +1,4 @@ +declare const a: { x: () => void } +declare const b: { x?: () => void } + +const c = { ...a, ...b };