Skip to content

Commit 28d83f6

Browse files
committed
move it back to checkIndexedAccessIndexType
1 parent de914f6 commit 28d83f6

3 files changed

Lines changed: 140 additions & 129 deletions

File tree

src/compiler/checker.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19584,15 +19584,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1958419584
if (objectType === wildcardType || indexType === wildcardType) {
1958519585
return wildcardType;
1958619586
}
19587-
if (accessNode?.kind === SyntaxKind.IndexedAccessType && 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-
}
1959619587
objectType = getReducedType(objectType);
1959719588
// If the object type has a string index signature and no other members we know that the result will
1959819589
// always be the type of that index signature and we can simplify accordingly.
@@ -19655,14 +19646,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1965519646
: getUnionType(propTypes, UnionReduction.Literal, aliasSymbol, aliasTypeArguments);
1965619647
}
1965719648
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-
}
1966619649
}
1966719650

1966819651
function getTypeFromIndexedAccessTypeNode(node: IndexedAccessTypeNode) {
@@ -42751,12 +42734,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4275142734
}
4275242735

4275342736
function checkIndexedAccessIndexType(type: Type, accessNode: IndexedAccessTypeNode | ElementAccessExpression) {
42737+
if (type.flags & TypeFlags.Never && isIndexedAccessTypeNode(accessNode)) {
42738+
if (!checkNonPublicPropertyAccess(getTypeFromTypeNode(accessNode.objectType), getTypeFromTypeNode(accessNode.indexType))) {
42739+
return errorType;
42740+
}
42741+
return type;
42742+
}
4275442743
if (!(type.flags & TypeFlags.IndexedAccess)) {
4275542744
return type;
4275642745
}
4275742746
// Check if the index type is assignable to 'keyof T' for the object type.
4275842747
const objectType = (type as IndexedAccessType).objectType;
4275942748
const indexType = (type as IndexedAccessType).indexType;
42749+
42750+
if (!checkNonPublicPropertyAccess(objectType, indexType)) {
42751+
return errorType;
42752+
}
42753+
4276042754
// skip index type deferral on remapping mapped types
4276142755
const objectIndexType = isGenericMappedType(objectType) && getMappedTypeNameTypeKind(objectType) === MappedTypeNameTypeKind.Remapping
4276242756
? getIndexTypeForMappedType(objectType, IndexFlags.None)
@@ -42773,6 +42767,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4277342767
}
4277442768
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
4277542769
return errorType;
42770+
42771+
function checkNonPublicPropertyAccess(objectType: Type, indexType: Type) {
42772+
const propertyName = getPropertyNameFromIndex(indexType, accessNode);
42773+
if (propertyName && someType(getApparentType(objectType), t => isNonPublicPropertyOfType(t, propertyName))) {
42774+
error(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName));
42775+
return false;
42776+
}
42777+
return true;
42778+
}
42779+
42780+
function isNonPublicPropertyOfType(type: Type, propertyName: __String): boolean {
42781+
if (type.flags & TypeFlags.Intersection) {
42782+
return some((type as IntersectionType).types, t => isNonPublicPropertyOfType(t, propertyName));
42783+
}
42784+
const propertySymbol = getPropertyOfType(type, propertyName);
42785+
return !!(propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & ModifierFlags.NonPublicAccessibilityModifier);
42786+
}
4277642787
}
4277742788

4277842789
function checkIndexedAccessType(node: IndexedAccessTypeNode) {

tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.types

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,32 @@ type X<T extends A> = [T["a"], (T | B)["a"]];
2424
> : ^^^^
2525

2626
type Y<T extends A | B> = T["a"];
27-
>Y : any
28-
> : ^^^
27+
>Y : Y<T>
28+
> : ^^^^
2929

3030
type Z<T extends A & B> = T["a"];
31-
>Z : any
32-
> : ^^^
31+
>Z : Z<T>
32+
> : ^^^^
3333

3434
type R<T extends A, T2 extends B> = (T | T2)["a"];
35-
>R : any
36-
> : ^^^
35+
>R : R<T, T2>
36+
> : ^^^^^^^^
3737

3838
type S<T extends B, T2 extends A> = (T | T2)["a"];
39-
>S : any
40-
> : ^^^
39+
>S : S<T, T2>
40+
> : ^^^^^^^^
4141

4242
type U<T extends A> = (T & B)["a"];
43-
>U : any
44-
> : ^^^
43+
>U : never
44+
> : ^^^^^
4545

4646
type V<T extends A, T2 extends B> = (T & T2)["a"];
47-
>V : any
48-
> : ^^^
47+
>V : never
48+
> : ^^^^^
4949

5050
type W<T extends B, T2 extends A> = (T & T2)["a"];
51-
>W : any
52-
> : ^^^
51+
>W : never
52+
> : ^^^^^
5353

5454
class C {
5555
>C : C
@@ -74,32 +74,32 @@ type X2<T extends C> = [T["a"], (T | D)["a"]];
7474
> : ^^^^^
7575

7676
type Y2<T extends C | D> = T["a"];
77-
>Y2 : any
78-
> : ^^^
77+
>Y2 : Y2<T>
78+
> : ^^^^^
7979

8080
type Z2<T extends C & D> = T["a"];
81-
>Z2 : any
82-
> : ^^^
81+
>Z2 : Z2<T>
82+
> : ^^^^^
8383

8484
type R2<T extends C, T2 extends D> = (T | T2)["a"];
85-
>R2 : any
86-
> : ^^^
85+
>R2 : R2<T, T2>
86+
> : ^^^^^^^^^
8787

8888
type S2<T extends D, T2 extends C> = (T | T2)["a"];
89-
>S2 : any
90-
> : ^^^
89+
>S2 : S2<T, T2>
90+
> : ^^^^^^^^^
9191

9292
type U2<T extends C> = (T & D)["a"];
93-
>U2 : any
94-
> : ^^^
93+
>U2 : never
94+
> : ^^^^^
9595

9696
type V2<T extends C, T2 extends D> = (T & T2)["a"];
97-
>V2 : any
98-
> : ^^^
97+
>V2 : never
98+
> : ^^^^^
9999

100100
type W2<T extends D, T2 extends C> = (T & T2)["a"];
101-
>W2 : any
102-
> : ^^^
101+
>W2 : never
102+
> : ^^^^^
103103

104104
class E {
105105
>E : E
@@ -124,32 +124,32 @@ type X3<T extends E> = [T["a"], (T | F)["a"]];
124124
> : ^^^^^
125125

126126
type Y3<T extends E | F> = T["a"];
127-
>Y3 : any
128-
> : ^^^
127+
>Y3 : Y3<T>
128+
> : ^^^^^
129129

130130
type Z3<T extends E & F> = T["a"];
131-
>Z3 : any
132-
> : ^^^
131+
>Z3 : Z3<T>
132+
> : ^^^^^
133133

134134
type R3<T extends E, T2 extends F> = (T | T2)["a"];
135-
>R3 : any
136-
> : ^^^
135+
>R3 : R3<T, T2>
136+
> : ^^^^^^^^^
137137

138138
type S3<T extends F, T2 extends E> = (T | T2)["a"];
139-
>S3 : any
140-
> : ^^^
139+
>S3 : S3<T, T2>
140+
> : ^^^^^^^^^
141141

142142
type U3<T extends E> = (T & F)["a"];
143-
>U3 : any
144-
> : ^^^
143+
>U3 : never
144+
> : ^^^^^
145145

146146
type V3<T extends E, T2 extends F> = (T & T2)["a"];
147-
>V3 : any
148-
> : ^^^
147+
>V3 : never
148+
> : ^^^^^
149149

150150
type W3<T extends F, T2 extends E> = (T & T2)["a"];
151-
>W3 : any
152-
> : ^^^
151+
>W3 : never
152+
> : ^^^^^
153153

154154
class G {
155155
>G : G
@@ -174,30 +174,30 @@ type X4<T extends G> = [T["a"], (T | H)["a"]];
174174
> : ^^^^^
175175

176176
type Y4<T extends G | H> = T["a"];
177-
>Y4 : any
178-
> : ^^^
177+
>Y4 : Y4<T>
178+
> : ^^^^^
179179

180180
type Z4<T extends G & H> = T["a"];
181-
>Z4 : any
182-
> : ^^^
181+
>Z4 : Z4<T>
182+
> : ^^^^^
183183

184184
type R4<T extends G, T2 extends H> = (T | T2)["a"];
185-
>R4 : any
186-
> : ^^^
185+
>R4 : R4<T, T2>
186+
> : ^^^^^^^^^
187187

188188
type S4<T extends H, T2 extends G> = (T | T2)["a"];
189-
>S4 : any
190-
> : ^^^
189+
>S4 : S4<T, T2>
190+
> : ^^^^^^^^^
191191

192192
type U4<T extends G> = (T & H)["a"];
193-
>U4 : any
194-
> : ^^^
193+
>U4 : U4<T>
194+
> : ^^^^^
195195

196196
type V4<T extends G, T2 extends H> = (T & T2)["a"];
197-
>V4 : any
198-
> : ^^^
197+
>V4 : V4<T, T2>
198+
> : ^^^^^^^^^
199199

200200
type W4<T extends H, T2 extends G> = (T & T2)["a"];
201-
>W4 : any
202-
> : ^^^
201+
>W4 : W4<T, T2>
202+
> : ^^^^^^^^^
203203

0 commit comments

Comments
 (0)