diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a4ad3af7d9a..65076aefa21 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9987,8 +9987,8 @@ namespace ts { }); } - function getLiteralTypeFromProperty(prop: Symbol, include: TypeFlags) { - if (!(getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.NonPublicAccessibilityModifier)) { + function getLiteralTypeFromProperty(prop: Symbol, include: TypeFlags, includeNonPublic?: boolean) { + if (includeNonPublic || !(getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.NonPublicAccessibilityModifier)) { let type = getLateBoundSymbol(prop).nameType; if (!type && !isKnownSymbol(prop)) { if (prop.escapedName === InternalSymbolName.Default) { @@ -10006,8 +10006,8 @@ namespace ts { return neverType; } - function getLiteralTypeFromProperties(type: Type, include: TypeFlags) { - return getUnionType(map(getPropertiesOfType(type), p => getLiteralTypeFromProperty(p, include))); + function getLiteralTypeFromProperties(type: Type, include: TypeFlags, includeNonPublic?: boolean) { + return getUnionType(map(getPropertiesOfType(type), p => getLiteralTypeFromProperty(p, include, includeNonPublic))); } function getNonEnumNumberIndexInfo(type: Type) { @@ -10023,10 +10023,10 @@ namespace ts { type === wildcardType ? wildcardType : type.flags & TypeFlags.Unknown ? neverType : type.flags & (TypeFlags.Any | TypeFlags.Never) ? keyofConstraintType : - stringsOnly ? !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? stringType : getLiteralTypeFromProperties(type, TypeFlags.StringLiteral) : - !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? getUnionType([stringType, numberType, getLiteralTypeFromProperties(type, TypeFlags.UniqueESSymbol)]) : - getNonEnumNumberIndexInfo(type) ? getUnionType([numberType, getLiteralTypeFromProperties(type, TypeFlags.StringLiteral | TypeFlags.UniqueESSymbol)]) : - getLiteralTypeFromProperties(type, TypeFlags.StringOrNumberLiteralOrUnique); + stringsOnly ? !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? stringType : getLiteralTypeFromProperties(type, TypeFlags.StringLiteral, /*includeNonPublic*/ true) : + !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? getUnionType([stringType, numberType, getLiteralTypeFromProperties(type, TypeFlags.UniqueESSymbol, /*includeNonPublic*/ true)]) : + getNonEnumNumberIndexInfo(type) ? getUnionType([numberType, getLiteralTypeFromProperties(type, TypeFlags.StringLiteral | TypeFlags.UniqueESSymbol, /*includeNonPublic*/ true)]) : + getLiteralTypeFromProperties(type, TypeFlags.StringOrNumberLiteralOrUnique, /*includeNonPublic*/ true); } function getExtractStringType(type: Type) { diff --git a/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.js b/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.js new file mode 100644 index 00000000000..0e8877479c9 --- /dev/null +++ b/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.js @@ -0,0 +1,14 @@ +//// [indexedAccessPrivateMemberOfGenericConstraint.ts] +class A { + private a: number; +} + +type B = T["a"]; + + +//// [indexedAccessPrivateMemberOfGenericConstraint.js] +var A = /** @class */ (function () { + function A() { + } + return A; +}()); diff --git a/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.symbols b/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.symbols new file mode 100644 index 00000000000..a6877397582 --- /dev/null +++ b/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts === +class A { +>A : Symbol(A, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 0, 0)) + + private a: number; +>a : Symbol(A.a, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 0, 9)) +} + +type B = T["a"]; +>B : Symbol(B, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 2, 1)) +>T : Symbol(T, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 4, 7)) +>A : Symbol(A, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 0, 0)) +>T : Symbol(T, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 4, 7)) + diff --git a/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.types b/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.types new file mode 100644 index 00000000000..3f59d719143 --- /dev/null +++ b/tests/baselines/reference/indexedAccessPrivateMemberOfGenericConstraint.types @@ -0,0 +1,11 @@ +=== tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts === +class A { +>A : A + + private a: number; +>a : number +} + +type B = T["a"]; +>B : T["a"] + diff --git a/tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts b/tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts new file mode 100644 index 00000000000..a2f2bb8c47b --- /dev/null +++ b/tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts @@ -0,0 +1,5 @@ +class A { + private a: number; +} + +type B = T["a"];