Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19584,6 +19584,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
if (objectType === wildcardType || indexType === wildcardType) {
return wildcardType;
}
if (isGenericObjectType(objectType)) {
const propertyName = getPropertyNameFromIndex(indexType, accessNode);
if (propertyName) {
if (someType(getApparentType(objectType), t => isNonPublicPropertyOfType(t, propertyName))) {
error(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName));
return errorType;
}
}
}
objectType = getReducedType(objectType);
// 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.
Expand Down Expand Up @@ -19646,6 +19655,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
: getUnionType(propTypes, UnionReduction.Literal, aliasSymbol, aliasTypeArguments);
}
return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, indexType, accessNode, accessFlags | AccessFlags.CacheSymbol | AccessFlags.ReportDeprecated);

function isNonPublicPropertyOfType(type: Type, propertyName: __String): boolean {
if (type.flags & TypeFlags.Intersection) {
return some((type as IntersectionType).types, t => isNonPublicPropertyOfType(t, propertyName));
}
const propertySymbol = getPropertyOfType(type, propertyName);
return !!(propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & ModifierFlags.NonPublicAccessibilityModifier);
}
}

function getTypeFromIndexedAccessTypeNode(node: IndexedAccessTypeNode) {
Expand Down Expand Up @@ -42754,16 +42771,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
return type;
}
if (isGenericObjectType(objectType)) {
const propertyName = getPropertyNameFromIndex(indexType, accessNode);
if (propertyName) {
const propertySymbol = forEachType(getApparentType(objectType), t => getPropertyOfType(t, propertyName));
if (propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & ModifierFlags.NonPublicAccessibilityModifier) {
error(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName));
return errorType;
}
}
}
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
return errorType;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,41 @@
indexedAccessPrivateMemberOfGenericConstraint.ts(9,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(9,32): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(10,27): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(11,27): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(12,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(13,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(14,23): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(15,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(16,37): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(26,25): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(26,33): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(27,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(28,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(29,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(30,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(31,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(32,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(33,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(43,33): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(44,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(45,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(46,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(47,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(48,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(49,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(50,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(60,25): error TS2536: Type '"a"' cannot be used to index type 'T'.
indexedAccessPrivateMemberOfGenericConstraint.ts(60,33): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(61,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(62,28): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(63,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(64,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(65,24): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(66,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
indexedAccessPrivateMemberOfGenericConstraint.ts(67,38): error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.


==== indexedAccessPrivateMemberOfGenericConstraint.ts (3 errors) ====
==== indexedAccessPrivateMemberOfGenericConstraint.ts (35 errors) ====
class A {
private a: number;
}
Expand All @@ -21,4 +53,124 @@ indexedAccessPrivateMemberOfGenericConstraint.ts(10,27): error TS4105: Private o
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Z<T extends A & B> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type R<T extends A, T2 extends B> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type S<T extends B, T2 extends A> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type U<T extends A> = (T & B)["a"];
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type V<T extends A, T2 extends B> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type W<T extends B, T2 extends A> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.

class C {
declare private a: number;
}

class D {
declare a: string;
}

type X2<T extends C> = [T["a"], (T | D)["a"]];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Y2<T extends C | D> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Z2<T extends C & D> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type R2<T extends C, T2 extends D> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type S2<T extends D, T2 extends C> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type U2<T extends C> = (T & D)["a"];
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type V2<T extends C, T2 extends D> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type W2<T extends D, T2 extends C> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.

class E {
declare a: number;
}

class F {
declare private a: string;
}

type X3<T extends E> = [T["a"], (T | F)["a"]];
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Y3<T extends E | F> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Z3<T extends E & F> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type R3<T extends E, T2 extends F> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type S3<T extends F, T2 extends E> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type U3<T extends E> = (T & F)["a"];
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type V3<T extends E, T2 extends F> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type W3<T extends F, T2 extends E> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.

class G {
declare b: number;
}

class H {
declare private a: string;
}

type X4<T extends G> = [T["a"], (T | H)["a"]];
~~~~~~
!!! error TS2536: Type '"a"' cannot be used to index type 'T'.
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Y4<T extends G | H> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type Z4<T extends G & H> = T["a"];
~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type R4<T extends G, T2 extends H> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type S4<T extends H, T2 extends G> = (T | T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type U4<T extends G> = (T & H)["a"];
~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type V4<T extends G, T2 extends H> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.
type W4<T extends H, T2 extends G> = (T & T2)["a"];
~~~~~~~~~~~~~
!!! error TS4105: Private or protected member 'a' cannot be accessed on a type parameter.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,62 @@ class B {
type X<T extends A> = [T["a"], (T | B)["a"]];
type Y<T extends A | B> = T["a"];
type Z<T extends A & B> = T["a"];
type R<T extends A, T2 extends B> = (T | T2)["a"];
type S<T extends B, T2 extends A> = (T | T2)["a"];
type U<T extends A> = (T & B)["a"];
type V<T extends A, T2 extends B> = (T & T2)["a"];
type W<T extends B, T2 extends A> = (T & T2)["a"];

class C {
declare private a: number;
}

class D {
declare a: string;
}

type X2<T extends C> = [T["a"], (T | D)["a"]];
type Y2<T extends C | D> = T["a"];
type Z2<T extends C & D> = T["a"];
type R2<T extends C, T2 extends D> = (T | T2)["a"];
type S2<T extends D, T2 extends C> = (T | T2)["a"];
type U2<T extends C> = (T & D)["a"];
type V2<T extends C, T2 extends D> = (T & T2)["a"];
type W2<T extends D, T2 extends C> = (T & T2)["a"];

class E {
declare a: number;
}

class F {
declare private a: string;
}

type X3<T extends E> = [T["a"], (T | F)["a"]];
type Y3<T extends E | F> = T["a"];
type Z3<T extends E & F> = T["a"];
type R3<T extends E, T2 extends F> = (T | T2)["a"];
type S3<T extends F, T2 extends E> = (T | T2)["a"];
type U3<T extends E> = (T & F)["a"];
type V3<T extends E, T2 extends F> = (T & T2)["a"];
type W3<T extends F, T2 extends E> = (T & T2)["a"];

class G {
declare b: number;
}

class H {
declare private a: string;
}

type X4<T extends G> = [T["a"], (T | H)["a"]];
type Y4<T extends G | H> = T["a"];
type Z4<T extends G & H> = T["a"];
type R4<T extends G, T2 extends H> = (T | T2)["a"];
type S4<T extends H, T2 extends G> = (T | T2)["a"];
type U4<T extends G> = (T & H)["a"];
type V4<T extends G, T2 extends H> = (T & T2)["a"];
type W4<T extends H, T2 extends G> = (T & T2)["a"];


//// [indexedAccessPrivateMemberOfGenericConstraint.js]
Expand All @@ -25,3 +81,33 @@ var B = /** @class */ (function () {
}
return B;
}());
var C = /** @class */ (function () {
function C() {
}
return C;
}());
var D = /** @class */ (function () {
function D() {
}
return D;
}());
var E = /** @class */ (function () {
function E() {
}
return E;
}());
var F = /** @class */ (function () {
function F() {
}
return F;
}());
var G = /** @class */ (function () {
function G() {
}
return G;
}());
var H = /** @class */ (function () {
function H() {
}
return H;
}());
Loading
Loading