Skip to content

Commit 48f74fd

Browse files
committed
Consider non-public literal members in index type of constrained type parameters
1 parent 36aa101 commit 48f74fd

File tree

5 files changed

+52
-8
lines changed

5 files changed

+52
-8
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9987,8 +9987,8 @@ namespace ts {
99879987
});
99889988
}
99899989

9990-
function getLiteralTypeFromProperty(prop: Symbol, include: TypeFlags) {
9991-
if (!(getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.NonPublicAccessibilityModifier)) {
9990+
function getLiteralTypeFromProperty(prop: Symbol, include: TypeFlags, includeNonPublic?: boolean) {
9991+
if (includeNonPublic || !(getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.NonPublicAccessibilityModifier)) {
99929992
let type = getLateBoundSymbol(prop).nameType;
99939993
if (!type && !isKnownSymbol(prop)) {
99949994
if (prop.escapedName === InternalSymbolName.Default) {
@@ -10006,8 +10006,8 @@ namespace ts {
1000610006
return neverType;
1000710007
}
1000810008

10009-
function getLiteralTypeFromProperties(type: Type, include: TypeFlags) {
10010-
return getUnionType(map(getPropertiesOfType(type), p => getLiteralTypeFromProperty(p, include)));
10009+
function getLiteralTypeFromProperties(type: Type, include: TypeFlags, includeNonPublic?: boolean) {
10010+
return getUnionType(map(getPropertiesOfType(type), p => getLiteralTypeFromProperty(p, include, includeNonPublic)));
1001110011
}
1001210012

1001310013
function getNonEnumNumberIndexInfo(type: Type) {
@@ -10023,10 +10023,10 @@ namespace ts {
1002310023
type === wildcardType ? wildcardType :
1002410024
type.flags & TypeFlags.Unknown ? neverType :
1002510025
type.flags & (TypeFlags.Any | TypeFlags.Never) ? keyofConstraintType :
10026-
stringsOnly ? !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? stringType : getLiteralTypeFromProperties(type, TypeFlags.StringLiteral) :
10027-
!noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? getUnionType([stringType, numberType, getLiteralTypeFromProperties(type, TypeFlags.UniqueESSymbol)]) :
10028-
getNonEnumNumberIndexInfo(type) ? getUnionType([numberType, getLiteralTypeFromProperties(type, TypeFlags.StringLiteral | TypeFlags.UniqueESSymbol)]) :
10029-
getLiteralTypeFromProperties(type, TypeFlags.StringOrNumberLiteralOrUnique);
10026+
stringsOnly ? !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? stringType : getLiteralTypeFromProperties(type, TypeFlags.StringLiteral, /*includeNonPublic*/ true) :
10027+
!noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? getUnionType([stringType, numberType, getLiteralTypeFromProperties(type, TypeFlags.UniqueESSymbol, /*includeNonPublic*/ true)]) :
10028+
getNonEnumNumberIndexInfo(type) ? getUnionType([numberType, getLiteralTypeFromProperties(type, TypeFlags.StringLiteral | TypeFlags.UniqueESSymbol, /*includeNonPublic*/ true)]) :
10029+
getLiteralTypeFromProperties(type, TypeFlags.StringOrNumberLiteralOrUnique, /*includeNonPublic*/ true);
1003010030
}
1003110031

1003210032
function getExtractStringType(type: Type) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [indexedAccessPrivateMemberOfGenericConstraint.ts]
2+
class A {
3+
private a: number;
4+
}
5+
6+
type B<T extends A> = T["a"];
7+
8+
9+
//// [indexedAccessPrivateMemberOfGenericConstraint.js]
10+
var A = /** @class */ (function () {
11+
function A() {
12+
}
13+
return A;
14+
}());
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
=== tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts ===
2+
class A {
3+
>A : Symbol(A, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 0, 0))
4+
5+
private a: number;
6+
>a : Symbol(A.a, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 0, 9))
7+
}
8+
9+
type B<T extends A> = T["a"];
10+
>B : Symbol(B, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 2, 1))
11+
>T : Symbol(T, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 4, 7))
12+
>A : Symbol(A, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 0, 0))
13+
>T : Symbol(T, Decl(indexedAccessPrivateMemberOfGenericConstraint.ts, 4, 7))
14+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts ===
2+
class A {
3+
>A : A
4+
5+
private a: number;
6+
>a : number
7+
}
8+
9+
type B<T extends A> = T["a"];
10+
>B : T["a"]
11+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class A {
2+
private a: number;
3+
}
4+
5+
type B<T extends A> = T["a"];

0 commit comments

Comments
 (0)