Consider non-public literal members in index type of constrained type parameters

This commit is contained in:
Andrew Branch 2019-06-14 17:29:39 -07:00
parent 36aa1014f8
commit 48f74fdf80
No known key found for this signature in database
GPG Key ID: 22CCA4B120C427D2
5 changed files with 52 additions and 8 deletions

View File

@ -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) {

View File

@ -0,0 +1,14 @@
//// [indexedAccessPrivateMemberOfGenericConstraint.ts]
class A {
private a: number;
}
type B<T extends A> = T["a"];
//// [indexedAccessPrivateMemberOfGenericConstraint.js]
var A = /** @class */ (function () {
function A() {
}
return A;
}());

View File

@ -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 extends A> = 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))

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/indexedAccessPrivateMemberOfGenericConstraint.ts ===
class A {
>A : A
private a: number;
>a : number
}
type B<T extends A> = T["a"];
>B : T["a"]

View File

@ -0,0 +1,5 @@
class A {
private a: number;
}
type B<T extends A> = T["a"];