From 5db2bbe565e612c0abc2885705f1dc26ca98c3e0 Mon Sep 17 00:00:00 2001 From: hesam-oxe Date: Fri, 12 Jun 2026 10:09:07 +0330 Subject: [PATCH 1/2] fix: error on private property access in generic intersection types (Go) Added check for conflicting private properties when resolving indexed access on intersection types. Closes microsoft/TypeScript#62294 --- internal/checker/checker.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 5a66fd5cee..8423005e1e 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -26778,6 +26778,21 @@ func (c *Checker) getIndexedAccessTypeOrUndefined(objectType *Type, indexType *T return c.wildcardType } objectType = c.getReducedType(objectType) + // If the object type is an intersection with conflicting private properties, + // report an error — we shouldn't be able to access those properties via T["key"] + if objectType.flags&TypeFlagsIntersection != 0 && objectType.flags&TypeFlagsNever == 0 { + props := c.getPropertiesOfUnionOrIntersectionType(objectType) + for _, prop := range props { + if c.isConflictingPrivateProperty(prop) && accessNode != nil { + declaringClass := c.getDeclaringClass(prop) + if declaringClass != nil { + c.error(accessNode, diagnostics.Property_0_is_private_and_only_accessible_within_class_1, + c.symbolToString(prop), c.TypeToString(c.getTypeOfSymbol(declaringClass))) + } + return nil + } + } + } // If the object type has a string index signature and no other members we know that the result will // always be the type of that index signature and we can simplify accordingly. if c.isStringIndexSignatureOnlyType(objectType) && indexType.flags&TypeFlagsNullable == 0 && c.isTypeAssignableToKind(indexType, TypeFlagsString|TypeFlagsNumber) { From 7a7285e85caecc00258802f253515191aed5954e Mon Sep 17 00:00:00 2001 From: hesam-oxe Date: Fri, 12 Jun 2026 10:13:14 +0330 Subject: [PATCH 2/2] fix: always return nil for conflicting private properties, fix whitespace --- internal/checker/checker.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 8423005e1e..1dec09d231 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -26783,11 +26783,13 @@ func (c *Checker) getIndexedAccessTypeOrUndefined(objectType *Type, indexType *T if objectType.flags&TypeFlagsIntersection != 0 && objectType.flags&TypeFlagsNever == 0 { props := c.getPropertiesOfUnionOrIntersectionType(objectType) for _, prop := range props { - if c.isConflictingPrivateProperty(prop) && accessNode != nil { - declaringClass := c.getDeclaringClass(prop) - if declaringClass != nil { - c.error(accessNode, diagnostics.Property_0_is_private_and_only_accessible_within_class_1, - c.symbolToString(prop), c.TypeToString(c.getTypeOfSymbol(declaringClass))) + if c.isConflictingPrivateProperty(prop) { + if accessNode != nil { + declaringClass := c.getDeclaringClass(prop) + if declaringClass != nil { + c.error(accessNode, diagnostics.Property_0_is_private_and_only_accessible_within_class_1, + c.symbolToString(prop), c.TypeToString(c.getTypeOfSymbol(declaringClass))) + } } return nil }