Skip to content

Commit 6e3ab15

Browse files
ajafffRyanCavanaugh
authored andcommitted
remove private named properties from rest and spread types (#35950)
* remove private named properties from rest and spread types Fixes: #35943 * code review
1 parent daf786e commit 6e3ab15

File tree

6 files changed

+136
-2
lines changed

6 files changed

+136
-2
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12906,8 +12906,9 @@ namespace ts {
1290612906

1290712907
/** We approximate own properties as non-methods plus methods that are inside the object literal */
1290812908
function isSpreadableProperty(prop: Symbol): boolean {
12909-
return !(prop.flags & (SymbolFlags.Method | SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) ||
12910-
!prop.declarations.some(decl => isClassLike(decl.parent));
12909+
return !some(prop.declarations, isPrivateIdentifierPropertyDeclaration) &&
12910+
(!(prop.flags & (SymbolFlags.Method | SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) ||
12911+
!prop.declarations.some(decl => isClassLike(decl.parent)));
1291112912
}
1291212913

1291312914
function getSpreadSymbol(prop: Symbol, readonly: boolean) {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(6,13): error TS2339: Property '#prop' does not exist on type '{}'.
2+
tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(8,14): error TS2339: Property '#prop' does not exist on type '{}'.
3+
4+
5+
==== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts (2 errors) ====
6+
class C {
7+
#prop = 1;
8+
9+
method(other: C) {
10+
const obj = { ...other };
11+
obj.#prop;
12+
~~~~~
13+
!!! error TS2339: Property '#prop' does not exist on type '{}'.
14+
const { ...rest } = other;
15+
rest.#prop;
16+
~~~~~
17+
!!! error TS2339: Property '#prop' does not exist on type '{}'.
18+
}
19+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//// [privateNameAndObjectRestSpread.ts]
2+
class C {
3+
#prop = 1;
4+
5+
method(other: C) {
6+
const obj = { ...other };
7+
obj.#prop;
8+
const { ...rest } = other;
9+
rest.#prop;
10+
}
11+
}
12+
13+
//// [privateNameAndObjectRestSpread.js]
14+
"use strict";
15+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
16+
if (!privateMap.has(receiver)) {
17+
throw new TypeError("attempted to get private field on non-instance");
18+
}
19+
return privateMap.get(receiver);
20+
};
21+
var __rest = (this && this.__rest) || function (s, e) {
22+
var t = {};
23+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
24+
t[p] = s[p];
25+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
26+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
27+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
28+
t[p[i]] = s[p[i]];
29+
}
30+
return t;
31+
};
32+
var _prop;
33+
class C {
34+
constructor() {
35+
_prop.set(this, 1);
36+
}
37+
method(other) {
38+
const obj = Object.assign({}, other);
39+
__classPrivateFieldGet(obj, _prop);
40+
const rest = __rest(other, []);
41+
__classPrivateFieldGet(rest, _prop);
42+
}
43+
}
44+
_prop = new WeakMap();
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts ===
2+
class C {
3+
>C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0))
4+
5+
#prop = 1;
6+
>#prop : Symbol(C.#prop, Decl(privateNameAndObjectRestSpread.ts, 0, 9))
7+
8+
method(other: C) {
9+
>method : Symbol(C.method, Decl(privateNameAndObjectRestSpread.ts, 1, 14))
10+
>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11))
11+
>C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0))
12+
13+
const obj = { ...other };
14+
>obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 4, 13))
15+
>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11))
16+
17+
obj.#prop;
18+
>obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 4, 13))
19+
20+
const { ...rest } = other;
21+
>rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 6, 15))
22+
>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11))
23+
24+
rest.#prop;
25+
>rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 6, 15))
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
=== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts ===
2+
class C {
3+
>C : C
4+
5+
#prop = 1;
6+
>#prop : number
7+
>1 : 1
8+
9+
method(other: C) {
10+
>method : (other: C) => void
11+
>other : C
12+
13+
const obj = { ...other };
14+
>obj : {}
15+
>{ ...other } : {}
16+
>other : C
17+
18+
obj.#prop;
19+
>obj.#prop : any
20+
>obj : {}
21+
22+
const { ...rest } = other;
23+
>rest : {}
24+
>other : C
25+
26+
rest.#prop;
27+
>rest.#prop : any
28+
>rest : {}
29+
}
30+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// @strict: true
2+
// @target: es6
3+
4+
class C {
5+
#prop = 1;
6+
7+
method(other: C) {
8+
const obj = { ...other };
9+
obj.#prop;
10+
const { ...rest } = other;
11+
rest.#prop;
12+
}
13+
}

0 commit comments

Comments
 (0)