@@ -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) {
0 commit comments