Skip to content

Commit e0dca0b

Browse files
author
Andy
authored
Error when destructuring private property in a parameter (#28562)
1 parent ea8ccc2 commit e0dca0b

6 files changed

+61
-23
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19027,7 +19027,7 @@ namespace ts {
1902719027
}
1902819028

1902919029
function markPropertyAsReferenced(prop: Symbol, nodeForCheckWriteOnly: Node | undefined, isThisAccess: boolean) {
19030-
if (nodeForCheckWriteOnly && isInTypeQuery(nodeForCheckWriteOnly) || !prop || !(prop.flags & SymbolFlags.ClassMember) || !prop.valueDeclaration || !hasModifier(prop.valueDeclaration, ModifierFlags.Private)) {
19030+
if (nodeForCheckWriteOnly && isInTypeQuery(nodeForCheckWriteOnly) || !(prop.flags & SymbolFlags.ClassMember) || !prop.valueDeclaration || !hasModifier(prop.valueDeclaration, ModifierFlags.Private)) {
1903119031
return;
1903219032
}
1903319033
if (nodeForCheckWriteOnly && isWriteOnlyAccess(nodeForCheckWriteOnly) && !(prop.flags & SymbolFlags.SetAccessor && !(prop.flags & SymbolFlags.GetAccessor))) {
@@ -25285,10 +25285,10 @@ namespace ts {
2528525285
if (!isBindingPattern(name)) {
2528625286
const nameText = getTextOfPropertyName(name);
2528725287
if (nameText) {
25288-
const property = getPropertyOfType(parentType!, nameText)!; // TODO: GH#18217
25289-
markPropertyAsReferenced(property, /*nodeForCheckWriteOnly*/ undefined, /*isThisAccess*/ false); // A destructuring is never a write-only reference.
25290-
if (parent.initializer && property) {
25291-
checkPropertyAccessibility(parent, parent.initializer.kind === SyntaxKind.SuperKeyword, parentType!, property);
25288+
const property = getPropertyOfType(parentType!, nameText); // TODO: GH#18217
25289+
if (property) {
25290+
markPropertyAsReferenced(property, /*nodeForCheckWriteOnly*/ undefined, /*isThisAccess*/ false); // A destructuring is never a write-only reference.
25291+
checkPropertyAccessibility(parent, !!parent.initializer && parent.initializer.kind === SyntaxKind.SuperKeyword, parentType!, property);
2529225292
}
2529325293
}
2529425294
}

tests/baselines/reference/privateProtectedMembersAreNotAccessibleDestructuring.errors.txt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAre
55
tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts(20,5): error TS2341: Property 'priv' is private and only accessible within class 'K'.
66
tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts(20,5): error TS2341: Property 'privateMethod' is private and only accessible within class 'K'.
77
tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts(20,5): error TS2445: Property 'prot' is protected and only accessible within class 'K' and its subclasses.
8+
tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts(21,12): error TS2341: Property 'priv' is private and only accessible within class 'K'.
9+
tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts(21,12): error TS2341: Property 'privateMethod' is private and only accessible within class 'K'.
10+
tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts(21,12): error TS2445: Property 'prot' is protected and only accessible within class 'K' and its subclasses.
811

912

10-
==== tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts (7 errors) ====
13+
==== tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts (10 errors) ====
1114
class K {
1215
private priv;
1316
protected prot;
@@ -26,7 +29,7 @@ tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAre
2629
}
2730
}
2831
let k = new K();
29-
let { priv } = k; // error
32+
let { priv } = k; // error
3033
~~~~~~~~
3134
!!! error TS2341: Property 'priv' is private and only accessible within class 'K'.
3235
let { prot } = k; // error
@@ -35,11 +38,20 @@ tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAre
3538
let { privateMethod } = k; // error
3639
~~~~~~~~~~~~~~~~~
3740
!!! error TS2341: Property 'privateMethod' is private and only accessible within class 'K'.
38-
let { priv: a, prot: b, privateMethod: f } = k; // error
39-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41+
let { priv: a, prot: b, privateMethod: pm } = k; // error
42+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4043
!!! error TS2341: Property 'priv' is private and only accessible within class 'K'.
41-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4245
!!! error TS2341: Property 'privateMethod' is private and only accessible within class 'K'.
43-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4447
!!! error TS2445: Property 'prot' is protected and only accessible within class 'K' and its subclasses.
48+
function f({ priv, prot, privateMethod }: K) {
49+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
50+
!!! error TS2341: Property 'priv' is private and only accessible within class 'K'.
51+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
52+
!!! error TS2341: Property 'privateMethod' is private and only accessible within class 'K'.
53+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54+
!!! error TS2445: Property 'prot' is protected and only accessible within class 'K' and its subclasses.
55+
56+
}
4557

tests/baselines/reference/privateProtectedMembersAreNotAccessibleDestructuring.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@ class C extends K {
1515
}
1616
}
1717
let k = new K();
18-
let { priv } = k; // error
18+
let { priv } = k; // error
1919
let { prot } = k; // error
2020
let { privateMethod } = k; // error
21-
let { priv: a, prot: b, privateMethod: f } = k; // error
21+
let { priv: a, prot: b, privateMethod: pm } = k; // error
22+
function f({ priv, prot, privateMethod }: K) {
23+
24+
}
2225

2326

2427
//// [privateProtectedMembersAreNotAccessibleDestructuring.js]
@@ -57,7 +60,10 @@ var C = /** @class */ (function (_super) {
5760
return C;
5861
}(K));
5962
var k = new K();
60-
var priv = k.priv; // error
63+
var priv = k.priv; // error
6164
var prot = k.prot; // error
6265
var privateMethod = k.privateMethod; // error
63-
var a = k.priv, b = k.prot, f = k.privateMethod; // error
66+
var a = k.priv, b = k.prot, pm = k.privateMethod; // error
67+
function f(_a) {
68+
var priv = _a.priv, prot = _a.prot, privateMethod = _a.privateMethod;
69+
}

tests/baselines/reference/privateProtectedMembersAreNotAccessibleDestructuring.symbols

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ let k = new K();
4949
>k : Symbol(k, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 15, 3))
5050
>K : Symbol(K, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 0, 0))
5151

52-
let { priv } = k; // error
52+
let { priv } = k; // error
5353
>priv : Symbol(priv, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 16, 5))
5454
>k : Symbol(k, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 15, 3))
5555

@@ -61,12 +61,21 @@ let { privateMethod } = k; // error
6161
>privateMethod : Symbol(privateMethod, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 18, 5))
6262
>k : Symbol(k, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 15, 3))
6363

64-
let { priv: a, prot: b, privateMethod: f } = k; // error
64+
let { priv: a, prot: b, privateMethod: pm } = k; // error
6565
>priv : Symbol(K.priv, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 0, 9))
6666
>a : Symbol(a, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 19, 5))
6767
>prot : Symbol(K.prot, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 1, 17))
6868
>b : Symbol(b, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 19, 14))
6969
>privateMethod : Symbol(K.privateMethod, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 2, 19))
70-
>f : Symbol(f, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 19, 23))
70+
>pm : Symbol(pm, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 19, 23))
7171
>k : Symbol(k, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 15, 3))
7272

73+
function f({ priv, prot, privateMethod }: K) {
74+
>f : Symbol(f, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 19, 48))
75+
>priv : Symbol(priv, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 20, 12))
76+
>prot : Symbol(prot, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 20, 18))
77+
>privateMethod : Symbol(privateMethod, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 20, 24))
78+
>K : Symbol(K, Decl(privateProtectedMembersAreNotAccessibleDestructuring.ts, 0, 0))
79+
80+
}
81+

tests/baselines/reference/privateProtectedMembersAreNotAccessibleDestructuring.types

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ let k = new K();
5151
>new K() : K
5252
>K : typeof K
5353

54-
let { priv } = k; // error
54+
let { priv } = k; // error
5555
>priv : any
5656
>k : K
5757

@@ -63,12 +63,20 @@ let { privateMethod } = k; // error
6363
>privateMethod : () => void
6464
>k : K
6565

66-
let { priv: a, prot: b, privateMethod: f } = k; // error
66+
let { priv: a, prot: b, privateMethod: pm } = k; // error
6767
>priv : any
6868
>a : any
6969
>prot : any
7070
>b : any
7171
>privateMethod : any
72-
>f : () => void
72+
>pm : () => void
7373
>k : K
7474

75+
function f({ priv, prot, privateMethod }: K) {
76+
>f : ({ priv, prot, privateMethod }: K) => void
77+
>priv : any
78+
>prot : any
79+
>privateMethod : () => void
80+
81+
}
82+

tests/cases/conformance/classes/members/accessibility/privateProtectedMembersAreNotAccessibleDestructuring.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ class C extends K {
1414
}
1515
}
1616
let k = new K();
17-
let { priv } = k; // error
17+
let { priv } = k; // error
1818
let { prot } = k; // error
1919
let { privateMethod } = k; // error
20-
let { priv: a, prot: b, privateMethod: f } = k; // error
20+
let { priv: a, prot: b, privateMethod: pm } = k; // error
21+
function f({ priv, prot, privateMethod }: K) {
22+
23+
}

0 commit comments

Comments
 (0)