Skip to content

Commit 020ad07

Browse files
committed
Consistently error on attempts to access private properties on generic objects
1 parent 73c0bc8 commit 020ad07

11 files changed

+1668
-15
lines changed

src/compiler/checker.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19584,6 +19584,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1958419584
if (objectType === wildcardType || indexType === wildcardType) {
1958519585
return wildcardType;
1958619586
}
19587+
if (isGenericObjectType(objectType)) {
19588+
const propertyName = getPropertyNameFromIndex(indexType, accessNode);
19589+
if (propertyName) {
19590+
if (someType(getApparentType(objectType), t => isNonPublicPropertyOfType(t, propertyName))) {
19591+
error(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName));
19592+
return errorType;
19593+
}
19594+
}
19595+
}
1958719596
objectType = getReducedType(objectType);
1958819597
// If the object type has a string index signature and no other members we know that the result will
1958919598
// always be the type of that index signature and we can simplify accordingly.
@@ -19646,6 +19655,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1964619655
: getUnionType(propTypes, UnionReduction.Literal, aliasSymbol, aliasTypeArguments);
1964719656
}
1964819657
return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, indexType, accessNode, accessFlags | AccessFlags.CacheSymbol | AccessFlags.ReportDeprecated);
19658+
19659+
function isNonPublicPropertyOfType(type: Type, propertyName: __String): boolean {
19660+
if (type.flags & TypeFlags.Intersection) {
19661+
return some((type as IntersectionType).types, t => isNonPublicPropertyOfType(t, propertyName));
19662+
}
19663+
const propertySymbol = getPropertyOfType(type, propertyName);
19664+
return !!(propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & ModifierFlags.NonPublicAccessibilityModifier);
19665+
}
1964919666
}
1965019667

1965119668
function getTypeFromIndexedAccessTypeNode(node: IndexedAccessTypeNode) {
@@ -42754,16 +42771,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4275442771
}
4275542772
return type;
4275642773
}
42757-
if (isGenericObjectType(objectType)) {
42758-
const propertyName = getPropertyNameFromIndex(indexType, accessNode);
42759-
if (propertyName) {
42760-
const propertySymbol = forEachType(getApparentType(objectType), t => getPropertyOfType(t, propertyName));
42761-
if (propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & ModifierFlags.NonPublicAccessibilityModifier) {
42762-
error(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName));
42763-
return errorType;
42764-
}
42765-
}
42766-
}
4276742774
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
4276842775
return errorType;
4276942776
}

tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.errors.txt

Lines changed: 153 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,41 @@
11
indexedAccessPrivateMemberOfGenericConstraint.ts(9,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
22
indexedAccessPrivateMemberOfGenericConstraint.ts(9,32): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
33
indexedAccessPrivateMemberOfGenericConstraint.ts(10,27): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
4+
indexedAccessPrivateMemberOfGenericConstraint.ts(11,27): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
5+
indexedAccessPrivateMemberOfGenericConstraint.ts(12,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
6+
indexedAccessPrivateMemberOfGenericConstraint.ts(13,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
7+
indexedAccessPrivateMemberOfGenericConstraint.ts(14,23): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
8+
indexedAccessPrivateMemberOfGenericConstraint.ts(15,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
9+
indexedAccessPrivateMemberOfGenericConstraint.ts(16,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
10+
indexedAccessPrivateMemberOfGenericConstraint.ts(26,25): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
11+
indexedAccessPrivateMemberOfGenericConstraint.ts(26,33): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
12+
indexedAccessPrivateMemberOfGenericConstraint.ts(27,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
13+
indexedAccessPrivateMemberOfGenericConstraint.ts(28,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
14+
indexedAccessPrivateMemberOfGenericConstraint.ts(29,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
15+
indexedAccessPrivateMemberOfGenericConstraint.ts(30,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
16+
indexedAccessPrivateMemberOfGenericConstraint.ts(31,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
17+
indexedAccessPrivateMemberOfGenericConstraint.ts(32,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
18+
indexedAccessPrivateMemberOfGenericConstraint.ts(33,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
19+
indexedAccessPrivateMemberOfGenericConstraint.ts(43,33): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
20+
indexedAccessPrivateMemberOfGenericConstraint.ts(44,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
21+
indexedAccessPrivateMemberOfGenericConstraint.ts(45,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
22+
indexedAccessPrivateMemberOfGenericConstraint.ts(46,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
23+
indexedAccessPrivateMemberOfGenericConstraint.ts(47,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
24+
indexedAccessPrivateMemberOfGenericConstraint.ts(48,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
25+
indexedAccessPrivateMemberOfGenericConstraint.ts(49,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
26+
indexedAccessPrivateMemberOfGenericConstraint.ts(50,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
27+
indexedAccessPrivateMemberOfGenericConstraint.ts(60,25): error TS2536: Type '"a"' cannot be used to index type 'T'.
28+
indexedAccessPrivateMemberOfGenericConstraint.ts(60,33): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
29+
indexedAccessPrivateMemberOfGenericConstraint.ts(61,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
30+
indexedAccessPrivateMemberOfGenericConstraint.ts(62,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
31+
indexedAccessPrivateMemberOfGenericConstraint.ts(63,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
32+
indexedAccessPrivateMemberOfGenericConstraint.ts(64,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
33+
indexedAccessPrivateMemberOfGenericConstraint.ts(65,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
34+
indexedAccessPrivateMemberOfGenericConstraint.ts(66,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
35+
indexedAccessPrivateMemberOfGenericConstraint.ts(67,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
436

537

6-
==== indexedAccessPrivateMemberOfGenericConstraint.ts (3 errors) ====
38+
==== indexedAccessPrivateMemberOfGenericConstraint.ts (35 errors) ====
739
class A {
840
private a: number;
941
}
@@ -21,4 +53,124 @@ indexedAccessPrivateMemberOfGenericConstraint.ts(10,27): error TS4105: Private o
2153
~~~~~~
2254
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
2355
type Z<T extends A & B> = T["a"];
56+
~~~~~~
57+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
58+
type R<T extends A, T2 extends B> = (T | T2)["a"];
59+
~~~~~~~~~~~~~
60+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
61+
type S<T extends B, T2 extends A> = (T | T2)["a"];
62+
~~~~~~~~~~~~~
63+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
64+
type U<T extends A> = (T & B)["a"];
65+
~~~~~~~~~~~~
66+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
67+
type V<T extends A, T2 extends B> = (T & T2)["a"];
68+
~~~~~~~~~~~~~
69+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
70+
type W<T extends B, T2 extends A> = (T & T2)["a"];
71+
~~~~~~~~~~~~~
72+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
73+
74+
class C {
75+
declare private a: number;
76+
}
77+
78+
class D {
79+
declare a: string;
80+
}
81+
82+
type X2<T extends C> = [T["a"], (T | D)["a"]];
83+
~~~~~~
84+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
85+
~~~~~~~~~~~~
86+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
87+
type Y2<T extends C | D> = T["a"];
88+
~~~~~~
89+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
90+
type Z2<T extends C & D> = T["a"];
91+
~~~~~~
92+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
93+
type R2<T extends C, T2 extends D> = (T | T2)["a"];
94+
~~~~~~~~~~~~~
95+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
96+
type S2<T extends D, T2 extends C> = (T | T2)["a"];
97+
~~~~~~~~~~~~~
98+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
99+
type U2<T extends C> = (T & D)["a"];
100+
~~~~~~~~~~~~
101+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
102+
type V2<T extends C, T2 extends D> = (T & T2)["a"];
103+
~~~~~~~~~~~~~
104+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
105+
type W2<T extends D, T2 extends C> = (T & T2)["a"];
106+
~~~~~~~~~~~~~
107+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
108+
109+
class E {
110+
declare a: number;
111+
}
112+
113+
class F {
114+
declare private a: string;
115+
}
116+
117+
type X3<T extends E> = [T["a"], (T | F)["a"]];
118+
~~~~~~~~~~~~
119+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
120+
type Y3<T extends E | F> = T["a"];
121+
~~~~~~
122+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
123+
type Z3<T extends E & F> = T["a"];
124+
~~~~~~
125+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
126+
type R3<T extends E, T2 extends F> = (T | T2)["a"];
127+
~~~~~~~~~~~~~
128+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
129+
type S3<T extends F, T2 extends E> = (T | T2)["a"];
130+
~~~~~~~~~~~~~
131+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
132+
type U3<T extends E> = (T & F)["a"];
133+
~~~~~~~~~~~~
134+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
135+
type V3<T extends E, T2 extends F> = (T & T2)["a"];
136+
~~~~~~~~~~~~~
137+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
138+
type W3<T extends F, T2 extends E> = (T & T2)["a"];
139+
~~~~~~~~~~~~~
140+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
141+
142+
class G {
143+
declare b: number;
144+
}
145+
146+
class H {
147+
declare private a: string;
148+
}
149+
150+
type X4<T extends G> = [T["a"], (T | H)["a"]];
151+
~~~~~~
152+
!!! error TS2536: Type '"a"' cannot be used to index type 'T'.
153+
~~~~~~~~~~~~
154+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
155+
type Y4<T extends G | H> = T["a"];
156+
~~~~~~
157+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
158+
type Z4<T extends G & H> = T["a"];
159+
~~~~~~
160+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
161+
type R4<T extends G, T2 extends H> = (T | T2)["a"];
162+
~~~~~~~~~~~~~
163+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
164+
type S4<T extends H, T2 extends G> = (T | T2)["a"];
165+
~~~~~~~~~~~~~
166+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
167+
type U4<T extends G> = (T & H)["a"];
168+
~~~~~~~~~~~~
169+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
170+
type V4<T extends G, T2 extends H> = (T & T2)["a"];
171+
~~~~~~~~~~~~~
172+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
173+
type W4<T extends H, T2 extends G> = (T & T2)["a"];
174+
~~~~~~~~~~~~~
175+
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
24176

tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,62 @@ class B {
1212
type X<T extends A> = [T["a"], (T | B)["a"]];
1313
type Y<T extends A | B> = T["a"];
1414
type Z<T extends A & B> = T["a"];
15+
type R<T extends A, T2 extends B> = (T | T2)["a"];
16+
type S<T extends B, T2 extends A> = (T | T2)["a"];
17+
type U<T extends A> = (T & B)["a"];
18+
type V<T extends A, T2 extends B> = (T & T2)["a"];
19+
type W<T extends B, T2 extends A> = (T & T2)["a"];
20+
21+
class C {
22+
declare private a: number;
23+
}
24+
25+
class D {
26+
declare a: string;
27+
}
28+
29+
type X2<T extends C> = [T["a"], (T | D)["a"]];
30+
type Y2<T extends C | D> = T["a"];
31+
type Z2<T extends C & D> = T["a"];
32+
type R2<T extends C, T2 extends D> = (T | T2)["a"];
33+
type S2<T extends D, T2 extends C> = (T | T2)["a"];
34+
type U2<T extends C> = (T & D)["a"];
35+
type V2<T extends C, T2 extends D> = (T & T2)["a"];
36+
type W2<T extends D, T2 extends C> = (T & T2)["a"];
37+
38+
class E {
39+
declare a: number;
40+
}
41+
42+
class F {
43+
declare private a: string;
44+
}
45+
46+
type X3<T extends E> = [T["a"], (T | F)["a"]];
47+
type Y3<T extends E | F> = T["a"];
48+
type Z3<T extends E & F> = T["a"];
49+
type R3<T extends E, T2 extends F> = (T | T2)["a"];
50+
type S3<T extends F, T2 extends E> = (T | T2)["a"];
51+
type U3<T extends E> = (T & F)["a"];
52+
type V3<T extends E, T2 extends F> = (T & T2)["a"];
53+
type W3<T extends F, T2 extends E> = (T & T2)["a"];
54+
55+
class G {
56+
declare b: number;
57+
}
58+
59+
class H {
60+
declare private a: string;
61+
}
62+
63+
type X4<T extends G> = [T["a"], (T | H)["a"]];
64+
type Y4<T extends G | H> = T["a"];
65+
type Z4<T extends G & H> = T["a"];
66+
type R4<T extends G, T2 extends H> = (T | T2)["a"];
67+
type S4<T extends H, T2 extends G> = (T | T2)["a"];
68+
type U4<T extends G> = (T & H)["a"];
69+
type V4<T extends G, T2 extends H> = (T & T2)["a"];
70+
type W4<T extends H, T2 extends G> = (T & T2)["a"];
1571

1672

1773
//// [indexedAccessPrivateMemberOfGenericConstraint.js]
@@ -25,3 +81,33 @@ var B = /** @class */ (function () {
2581
}
2682
return B;
2783
}());
84+
var C = /** @class */ (function () {
85+
function C() {
86+
}
87+
return C;
88+
}());
89+
var D = /** @class */ (function () {
90+
function D() {
91+
}
92+
return D;
93+
}());
94+
var E = /** @class */ (function () {
95+
function E() {
96+
}
97+
return E;
98+
}());
99+
var F = /** @class */ (function () {
100+
function F() {
101+
}
102+
return F;
103+
}());
104+
var G = /** @class */ (function () {
105+
function G() {
106+
}
107+
return G;
108+
}());
109+
var H = /** @class */ (function () {
110+
function H() {
111+
}
112+
return H;
113+
}());

0 commit comments

Comments
 (0)