Skip to content

Commit ceb5fac

Browse files
authored
Merge pull request #13558 from HerringtonDarkholme/rest-spread-intrinsic
Fix #13556: enable rest/spread on `object`
2 parents c1181ae + 24bb21c commit ceb5fac

11 files changed

+69
-8
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/// <reference path="moduleNameResolver.ts"/>
1+
/// <reference path="moduleNameResolver.ts"/>
22
/// <reference path="binder.ts"/>
33

44
/* @internal */
@@ -6311,6 +6311,9 @@ namespace ts {
63116311
if (right.flags & TypeFlags.Union) {
63126312
return mapType(right, t => getSpreadType(left, t));
63136313
}
6314+
if (right.flags & TypeFlags.NonPrimitive) {
6315+
return emptyObjectType;
6316+
}
63146317

63156318
const members = createMap<Symbol>();
63166319
const skippedPrivateMembers = createMap<boolean>();
@@ -11804,7 +11807,7 @@ namespace ts {
1180411807
}
1180511808

1180611809
function isValidSpreadType(type: Type): boolean {
11807-
return !!(type.flags & (TypeFlags.Any | TypeFlags.Null | TypeFlags.Undefined) ||
11810+
return !!(type.flags & (TypeFlags.Any | TypeFlags.Null | TypeFlags.Undefined | TypeFlags.NonPrimitive) ||
1180811811
type.flags & TypeFlags.Object && !isGenericMappedType(type) ||
1180911812
type.flags & TypeFlags.UnionOrIntersection && !forEach((<UnionOrIntersectionType>type).types, t => !isValidSpreadType(t)));
1181011813
}
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
tests/cases/conformance/types/nonPrimitive/nonPrimitiveAccessProperty.ts(3,3): error TS2339: Property 'nonExist' does not exist on type 'object'.
2+
tests/cases/conformance/types/nonPrimitive/nonPrimitiveAccessProperty.ts(5,7): error TS2459: Type 'object' has no property 'destructuring' and no string index signature.
23

34

4-
==== tests/cases/conformance/types/nonPrimitive/nonPrimitiveAccessProperty.ts (1 errors) ====
5+
==== tests/cases/conformance/types/nonPrimitive/nonPrimitiveAccessProperty.ts (2 errors) ====
56
var a: object;
67
a.toString();
78
a.nonExist(); // error
89
~~~~~~~~
910
!!! error TS2339: Property 'nonExist' does not exist on type 'object'.
11+
12+
var { destructuring } = a; // error
13+
~~~~~~~~~~~~~
14+
!!! error TS2459: Type 'object' has no property 'destructuring' and no string index signature.
15+
var { ...rest } = a; // ok
1016

tests/baselines/reference/nonPrimitiveAccessProperty.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,23 @@
22
var a: object;
33
a.toString();
44
a.nonExist(); // error
5+
6+
var { destructuring } = a; // error
7+
var { ...rest } = a; // ok
58

69

710
//// [nonPrimitiveAccessProperty.js]
11+
var __rest = (this && this.__rest) || function (s, e) {
12+
var t = {};
13+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14+
t[p] = s[p];
15+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
16+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
17+
t[p[i]] = s[p[i]];
18+
return t;
19+
};
820
var a;
921
a.toString();
1022
a.nonExist(); // error
23+
var destructuring = a.destructuring; // error
24+
var rest = __rest(a, []); // ok

tests/baselines/reference/objectSpread.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ let computedAfter: { a: number, b: string, "at the end": number } =
7878
// shortcut syntax
7979
let a = 12;
8080
let shortCutted: { a: number, b: string } = { ...o, a }
81-
81+
// non primitive
82+
let spreadNonPrimitive = { ...<object>{}};
8283

8384

8485
//// [objectSpread.js]
@@ -148,4 +149,6 @@ var computedAfter = __assign({}, o, (_c = { b: 'yeah' }, _c['at the end'] = 14,
148149
// shortcut syntax
149150
var a = 12;
150151
var shortCutted = __assign({}, o, { a: a });
152+
// non primitive
153+
var spreadNonPrimitive = __assign({}, {});
151154
var _a, _b, _c;

tests/baselines/reference/objectSpread.symbols

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,4 +316,7 @@ let shortCutted: { a: number, b: string } = { ...o, a }
316316
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
317317
>a : Symbol(a, Decl(objectSpread.ts, 78, 51))
318318

319+
// non primitive
320+
let spreadNonPrimitive = { ...<object>{}};
321+
>spreadNonPrimitive : Symbol(spreadNonPrimitive, Decl(objectSpread.ts, 80, 3))
319322

tests/baselines/reference/objectSpread.types

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,4 +407,10 @@ let shortCutted: { a: number, b: string } = { ...o, a }
407407
>o : { a: number; b: string; }
408408
>a : number
409409

410+
// non primitive
411+
let spreadNonPrimitive = { ...<object>{}};
412+
>spreadNonPrimitive : {}
413+
>{ ...<object>{}} : {}
414+
><object>{} : object
415+
>{} : {}
410416

tests/baselines/reference/objectSpreadNegative.errors.txt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(37,19): error TS269
1414
tests/cases/conformance/types/spread/objectSpreadNegative.ts(42,1): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{}' has no compatible call signatures.
1515
tests/cases/conformance/types/spread/objectSpreadNegative.ts(46,12): error TS2339: Property 'b' does not exist on type '{}'.
1616
tests/cases/conformance/types/spread/objectSpreadNegative.ts(52,9): error TS2339: Property 'm' does not exist on type '{ p: number; }'.
17-
tests/cases/conformance/types/spread/objectSpreadNegative.ts(56,14): error TS2698: Spread types may only be created from object types.
18-
tests/cases/conformance/types/spread/objectSpreadNegative.ts(59,14): error TS2698: Spread types may only be created from object types.
17+
tests/cases/conformance/types/spread/objectSpreadNegative.ts(57,11): error TS2339: Property 'a' does not exist on type '{}'.
18+
tests/cases/conformance/types/spread/objectSpreadNegative.ts(61,14): error TS2698: Spread types may only be created from object types.
19+
tests/cases/conformance/types/spread/objectSpreadNegative.ts(64,14): error TS2698: Spread types may only be created from object types.
1920

2021

21-
==== tests/cases/conformance/types/spread/objectSpreadNegative.ts (15 errors) ====
22+
==== tests/cases/conformance/types/spread/objectSpreadNegative.ts (16 errors) ====
2223
let o = { a: 1, b: 'no' }
2324

2425
/// private propagates
@@ -101,6 +102,13 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(59,14): error TS269
101102
~
102103
!!! error TS2339: Property 'm' does not exist on type '{ p: number; }'.
103104

105+
// non primitive
106+
let obj: object = { a: 123 };
107+
let spreadObj = { ...obj };
108+
spreadObj.a; // error 'a' is not in {}
109+
~
110+
!!! error TS2339: Property 'a' does not exist on type '{}'.
111+
104112
// generics
105113
function f<T, U>(t: T, u: U) {
106114
return { ...t, ...u, id: 'id' };

tests/baselines/reference/objectSpreadNegative.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ let c: C = new C()
5252
let spreadC = { ...c }
5353
spreadC.m(); // error 'm' is not in '{ ... c }'
5454

55+
// non primitive
56+
let obj: object = { a: 123 };
57+
let spreadObj = { ...obj };
58+
spreadObj.a; // error 'a' is not in {}
59+
5560
// generics
5661
function f<T, U>(t: T, u: U) {
5762
return { ...t, ...u, id: 'id' };
@@ -132,6 +137,10 @@ var C = (function () {
132137
var c = new C();
133138
var spreadC = __assign({}, c);
134139
spreadC.m(); // error 'm' is not in '{ ... c }'
140+
// non primitive
141+
var obj = { a: 123 };
142+
var spreadObj = __assign({}, obj);
143+
spreadObj.a; // error 'a' is not in {}
135144
// generics
136145
function f(t, u) {
137146
return __assign({}, t, u, { id: 'id' });
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
var a: object;
22
a.toString();
33
a.nonExist(); // error
4+
5+
var { destructuring } = a; // error
6+
var { ...rest } = a; // ok

tests/cases/conformance/types/spread/objectSpread.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,5 @@ let computedAfter: { a: number, b: string, "at the end": number } =
7878
// shortcut syntax
7979
let a = 12;
8080
let shortCutted: { a: number, b: string } = { ...o, a }
81-
81+
// non primitive
82+
let spreadNonPrimitive = { ...<object>{}};

tests/cases/conformance/types/spread/objectSpreadNegative.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ let c: C = new C()
5252
let spreadC = { ...c }
5353
spreadC.m(); // error 'm' is not in '{ ... c }'
5454

55+
// non primitive
56+
let obj: object = { a: 123 };
57+
let spreadObj = { ...obj };
58+
spreadObj.a; // error 'a' is not in {}
59+
5560
// generics
5661
function f<T, U>(t: T, u: U) {
5762
return { ...t, ...u, id: 'id' };

0 commit comments

Comments
 (0)