mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
remove private named properties from rest and spread types (#35950)
* remove private named properties from rest and spread types Fixes: #35943 * code review
This commit is contained in:
committed by
Ryan Cavanaugh
parent
daf786ecd0
commit
6e3ab1529f
@@ -12906,8 +12906,9 @@ namespace ts {
|
||||
|
||||
/** We approximate own properties as non-methods plus methods that are inside the object literal */
|
||||
function isSpreadableProperty(prop: Symbol): boolean {
|
||||
return !(prop.flags & (SymbolFlags.Method | SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) ||
|
||||
!prop.declarations.some(decl => isClassLike(decl.parent));
|
||||
return !some(prop.declarations, isPrivateIdentifierPropertyDeclaration) &&
|
||||
(!(prop.flags & (SymbolFlags.Method | SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) ||
|
||||
!prop.declarations.some(decl => isClassLike(decl.parent)));
|
||||
}
|
||||
|
||||
function getSpreadSymbol(prop: Symbol, readonly: boolean) {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(6,13): error TS2339: Property '#prop' does not exist on type '{}'.
|
||||
tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(8,14): error TS2339: Property '#prop' does not exist on type '{}'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts (2 errors) ====
|
||||
class C {
|
||||
#prop = 1;
|
||||
|
||||
method(other: C) {
|
||||
const obj = { ...other };
|
||||
obj.#prop;
|
||||
~~~~~
|
||||
!!! error TS2339: Property '#prop' does not exist on type '{}'.
|
||||
const { ...rest } = other;
|
||||
rest.#prop;
|
||||
~~~~~
|
||||
!!! error TS2339: Property '#prop' does not exist on type '{}'.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
//// [privateNameAndObjectRestSpread.ts]
|
||||
class C {
|
||||
#prop = 1;
|
||||
|
||||
method(other: C) {
|
||||
const obj = { ...other };
|
||||
obj.#prop;
|
||||
const { ...rest } = other;
|
||||
rest.#prop;
|
||||
}
|
||||
}
|
||||
|
||||
//// [privateNameAndObjectRestSpread.js]
|
||||
"use strict";
|
||||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
|
||||
if (!privateMap.has(receiver)) {
|
||||
throw new TypeError("attempted to get private field on non-instance");
|
||||
}
|
||||
return privateMap.get(receiver);
|
||||
};
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
||||
t[p] = s[p];
|
||||
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
||||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
||||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
||||
t[p[i]] = s[p[i]];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
var _prop;
|
||||
class C {
|
||||
constructor() {
|
||||
_prop.set(this, 1);
|
||||
}
|
||||
method(other) {
|
||||
const obj = Object.assign({}, other);
|
||||
__classPrivateFieldGet(obj, _prop);
|
||||
const rest = __rest(other, []);
|
||||
__classPrivateFieldGet(rest, _prop);
|
||||
}
|
||||
}
|
||||
_prop = new WeakMap();
|
||||
@@ -0,0 +1,27 @@
|
||||
=== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts ===
|
||||
class C {
|
||||
>C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0))
|
||||
|
||||
#prop = 1;
|
||||
>#prop : Symbol(C.#prop, Decl(privateNameAndObjectRestSpread.ts, 0, 9))
|
||||
|
||||
method(other: C) {
|
||||
>method : Symbol(C.method, Decl(privateNameAndObjectRestSpread.ts, 1, 14))
|
||||
>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11))
|
||||
>C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0))
|
||||
|
||||
const obj = { ...other };
|
||||
>obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 4, 13))
|
||||
>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11))
|
||||
|
||||
obj.#prop;
|
||||
>obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 4, 13))
|
||||
|
||||
const { ...rest } = other;
|
||||
>rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 6, 15))
|
||||
>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11))
|
||||
|
||||
rest.#prop;
|
||||
>rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 6, 15))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
=== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts ===
|
||||
class C {
|
||||
>C : C
|
||||
|
||||
#prop = 1;
|
||||
>#prop : number
|
||||
>1 : 1
|
||||
|
||||
method(other: C) {
|
||||
>method : (other: C) => void
|
||||
>other : C
|
||||
|
||||
const obj = { ...other };
|
||||
>obj : {}
|
||||
>{ ...other } : {}
|
||||
>other : C
|
||||
|
||||
obj.#prop;
|
||||
>obj.#prop : any
|
||||
>obj : {}
|
||||
|
||||
const { ...rest } = other;
|
||||
>rest : {}
|
||||
>other : C
|
||||
|
||||
rest.#prop;
|
||||
>rest.#prop : any
|
||||
>rest : {}
|
||||
}
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
// @strict: true
|
||||
// @target: es6
|
||||
|
||||
class C {
|
||||
#prop = 1;
|
||||
|
||||
method(other: C) {
|
||||
const obj = { ...other };
|
||||
obj.#prop;
|
||||
const { ...rest } = other;
|
||||
rest.#prop;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user