Skip to content

Commit e58d80a

Browse files
authored
Merge pull request #20648 from Microsoft/nonprimitive-spreads-to-empty-object
Non-primitive spreads to empty object
2 parents 9f36219 + 4bc0d85 commit e58d80a

File tree

8 files changed

+52
-11
lines changed

8 files changed

+52
-11
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8327,10 +8327,7 @@ namespace ts {
83278327
if (right.flags & TypeFlags.Union) {
83288328
return mapType(right, t => getSpreadType(left, t, symbol, propagatedFlags));
83298329
}
8330-
if (right.flags & TypeFlags.NonPrimitive) {
8331-
return nonPrimitiveType;
8332-
}
8333-
if (right.flags & (TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.EnumLike)) {
8330+
if (right.flags & (TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.EnumLike | TypeFlags.NonPrimitive)) {
83348331
return left;
83358332
}
83368333

tests/baselines/reference/objectSpread.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,8 @@ let shortCutted: { a: number, b: string } = { ...o, a }
571571

572572
// non primitive
573573
let spreadNonPrimitive = { ...<object>{}};
574-
>spreadNonPrimitive : object
575-
>{ ...<object>{}} : object
574+
>spreadNonPrimitive : {}
575+
>{ ...<object>{}} : {}
576576
><object>{} : object
577577
>{} : {}
578578

tests/baselines/reference/objectSpreadNegative.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(38,19): error TS269
1515
tests/cases/conformance/types/spread/objectSpreadNegative.ts(43,1): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{}' has no compatible call signatures.
1616
tests/cases/conformance/types/spread/objectSpreadNegative.ts(47,12): error TS2339: Property 'b' does not exist on type '{}'.
1717
tests/cases/conformance/types/spread/objectSpreadNegative.ts(53,9): error TS2339: Property 'm' does not exist on type '{ p: number; }'.
18-
tests/cases/conformance/types/spread/objectSpreadNegative.ts(58,11): error TS2339: Property 'a' does not exist on type 'object'.
18+
tests/cases/conformance/types/spread/objectSpreadNegative.ts(58,11): error TS2339: Property 'a' does not exist on type '{}'.
1919
tests/cases/conformance/types/spread/objectSpreadNegative.ts(62,14): error TS2698: Spread types may only be created from object types.
2020
tests/cases/conformance/types/spread/objectSpreadNegative.ts(65,14): error TS2698: Spread types may only be created from object types.
2121
tests/cases/conformance/types/spread/objectSpreadNegative.ts(79,37): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
@@ -117,7 +117,7 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(84,7): error TS2322
117117
let spreadObj = { ...obj };
118118
spreadObj.a; // error 'a' is not in {}
119119
~
120-
!!! error TS2339: Property 'a' does not exist on type 'object'.
120+
!!! error TS2339: Property 'a' does not exist on type '{}'.
121121

122122
// generics
123123
function f<T, U>(t: T, u: U) {

tests/baselines/reference/objectSpreadNegative.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,13 @@ let obj: object = { a: 123 };
222222
>123 : 123
223223

224224
let spreadObj = { ...obj };
225-
>spreadObj : object
226-
>{ ...obj } : object
225+
>spreadObj : {}
226+
>{ ...obj } : {}
227227
>obj : object
228228

229229
spreadObj.a; // error 'a' is not in {}
230230
>spreadObj.a : any
231-
>spreadObj : object
231+
>spreadObj : {}
232232
>a : any
233233

234234
// generics
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [spreadNonPrimitive.ts]
2+
declare let o: object;
3+
const x: { a: number, b: number } = { a: 1, ...o, b: 2 };
4+
5+
6+
//// [spreadNonPrimitive.js]
7+
var __assign = (this && this.__assign) || Object.assign || function(t) {
8+
for (var s, i = 1, n = arguments.length; i < n; i++) {
9+
s = arguments[i];
10+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11+
t[p] = s[p];
12+
}
13+
return t;
14+
};
15+
var x = __assign({ a: 1 }, o, { b: 2 });
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
=== tests/cases/conformance/types/spread/spreadNonPrimitive.ts ===
2+
declare let o: object;
3+
>o : Symbol(o, Decl(spreadNonPrimitive.ts, 0, 11))
4+
5+
const x: { a: number, b: number } = { a: 1, ...o, b: 2 };
6+
>x : Symbol(x, Decl(spreadNonPrimitive.ts, 1, 5))
7+
>a : Symbol(a, Decl(spreadNonPrimitive.ts, 1, 10))
8+
>b : Symbol(b, Decl(spreadNonPrimitive.ts, 1, 21))
9+
>a : Symbol(a, Decl(spreadNonPrimitive.ts, 1, 37))
10+
>o : Symbol(o, Decl(spreadNonPrimitive.ts, 0, 11))
11+
>b : Symbol(b, Decl(spreadNonPrimitive.ts, 1, 49))
12+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
=== tests/cases/conformance/types/spread/spreadNonPrimitive.ts ===
2+
declare let o: object;
3+
>o : object
4+
5+
const x: { a: number, b: number } = { a: 1, ...o, b: 2 };
6+
>x : { a: number; b: number; }
7+
>a : number
8+
>b : number
9+
>{ a: 1, ...o, b: 2 } : { b: number; a: number; }
10+
>a : number
11+
>1 : 1
12+
>o : object
13+
>b : number
14+
>2 : 2
15+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
declare let o: object;
2+
const x: { a: number, b: number } = { a: 1, ...o, b: 2 };

0 commit comments

Comments
 (0)