@@ -3891,6 +3891,12 @@ namespace ts {
38913891 return result || emptyArray;
38923892 }
38933893
3894+ function getNamedOrIndexSignatureMembers(members: SymbolTable): Symbol[] {
3895+ const result = getNamedMembers(members);
3896+ const index = getIndexSymbolFromSymbolTable(members);
3897+ return index ? concatenate(result, [index]) : result;
3898+ }
3899+
38943900 function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: readonly Signature[], constructSignatures: readonly Signature[], stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
38953901 const resolved = <ResolvedType>type;
38963902 resolved.members = members;
@@ -10764,6 +10770,7 @@ namespace ts {
1076410770 // Combinations of function, class, enum and module
1076510771 let members = emptySymbols;
1076610772 let stringIndexInfo: IndexInfo | undefined;
10773+ let numberIndexInfo: IndexInfo | undefined;
1076710774 if (symbol.exports) {
1076810775 members = getExportsOfSymbol(symbol);
1076910776 if (symbol === globalThisSymbol) {
@@ -10776,20 +10783,32 @@ namespace ts {
1077610783 members = varsOnly;
1077710784 }
1077810785 }
10786+ let baseConstructorIndexInfo: IndexInfo | undefined;
1077910787 setStructuredTypeMembers(type, members, emptyArray, emptyArray, undefined, undefined);
1078010788 if (symbol.flags & SymbolFlags.Class) {
1078110789 const classType = getDeclaredTypeOfClassOrInterface(symbol);
1078210790 const baseConstructorType = getBaseConstructorTypeOfClass(classType);
1078310791 if (baseConstructorType.flags & (TypeFlags.Object | TypeFlags.Intersection | TypeFlags.TypeVariable)) {
10784- members = createSymbolTable(getNamedMembers (members));
10792+ members = createSymbolTable(getNamedOrIndexSignatureMembers (members));
1078510793 addInheritedMembers(members, getPropertiesOfType(baseConstructorType));
1078610794 }
1078710795 else if (baseConstructorType === anyType) {
10788- stringIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
10796+ baseConstructorIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
10797+ }
10798+ }
10799+
10800+ const indexSymbol = getIndexSymbolFromSymbolTable(members);
10801+ if (indexSymbol) {
10802+ stringIndexInfo = getIndexInfoOfIndexSymbol(indexSymbol, IndexKind.String);
10803+ numberIndexInfo = getIndexInfoOfIndexSymbol(indexSymbol, IndexKind.Number);
10804+ }
10805+ else {
10806+ stringIndexInfo = baseConstructorIndexInfo;
10807+ if (symbol.flags & SymbolFlags.Enum && (getDeclaredTypeOfSymbol(symbol).flags & TypeFlags.Enum ||
10808+ some(type.properties, prop => !!(getTypeOfSymbol(prop).flags & TypeFlags.NumberLike)))) {
10809+ numberIndexInfo = enumNumberIndexInfo;
1078910810 }
1079010811 }
10791- const numberIndexInfo = symbol.flags & SymbolFlags.Enum && (getDeclaredTypeOfSymbol(symbol).flags & TypeFlags.Enum ||
10792- some(type.properties, prop => !!(getTypeOfSymbol(prop).flags & TypeFlags.NumberLike))) ? enumNumberIndexInfo : undefined;
1079310812 setStructuredTypeMembers(type, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
1079410813 // We resolve the members before computing the signatures because a signature may use
1079510814 // typeof with a qualified name expression that circularly references the type we are
@@ -10817,6 +10836,13 @@ namespace ts {
1081710836 }
1081810837 }
1081910838
10839+ function getIndexInfoOfIndexSymbol(indexSymbol: Symbol, indexKind: IndexKind) {
10840+ const declaration = getIndexDeclarationOfIndexSymbol(indexSymbol, indexKind);
10841+ if (!declaration) return undefined;
10842+ return createIndexInfo(declaration.type ? getTypeFromTypeNode(declaration.type) : anyType,
10843+ hasEffectiveModifier(declaration, ModifierFlags.Readonly), declaration);
10844+ }
10845+
1082010846 function resolveReverseMappedTypeMembers(type: ReverseMappedType) {
1082110847 const indexInfo = getIndexInfoOfType(type.source, IndexKind.String);
1082210848 const modifiers = getMappedTypeModifiers(type.mappedType);
@@ -12363,12 +12389,20 @@ namespace ts {
1236312389 }
1236412390
1236512391 function getIndexSymbol(symbol: Symbol): Symbol | undefined {
12366- return symbol.members!.get(InternalSymbolName.Index);
12392+ return symbol.members ? getIndexSymbolFromSymbolTable(symbol.members) : undefined;
12393+ }
12394+
12395+ function getIndexSymbolFromSymbolTable(symbolTable: SymbolTable): Symbol | undefined {
12396+ return symbolTable.get(InternalSymbolName.Index);
12397+ }
12398+
12399+ function getIndexDeclarationOfSymbol(symbol: Symbol | undefined, kind: IndexKind): IndexSignatureDeclaration | undefined {
12400+ const indexSymbol = symbol && getIndexSymbol(symbol);
12401+ return indexSymbol && getIndexDeclarationOfIndexSymbol(indexSymbol, kind);
1236712402 }
1236812403
12369- function getIndexDeclarationOfSymbol(symbol : Symbol, kind: IndexKind): IndexSignatureDeclaration | undefined {
12404+ function getIndexDeclarationOfIndexSymbol(indexSymbol : Symbol, kind: IndexKind): IndexSignatureDeclaration | undefined {
1237012405 const syntaxKind = kind === IndexKind.Number ? SyntaxKind.NumberKeyword : SyntaxKind.StringKeyword;
12371- const indexSymbol = getIndexSymbol(symbol);
1237212406 if (indexSymbol?.declarations) {
1237312407 for (const decl of indexSymbol.declarations) {
1237412408 const node = cast(decl, isIndexSignatureDeclaration);
@@ -36723,6 +36757,7 @@ namespace ts {
3672336757
3672436758 if (produceDiagnostics) {
3672536759 checkIndexConstraints(type);
36760+ checkIndexConstraints(staticType);
3672636761 checkTypeForDuplicateIndexSignatures(node);
3672736762 checkPropertyInitialization(node);
3672836763 }
@@ -40109,7 +40144,7 @@ namespace ts {
4010940144 if (node.kind === SyntaxKind.PropertySignature || node.kind === SyntaxKind.MethodSignature) {
4011040145 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_type_member, tokenToString(modifier.kind));
4011140146 }
40112- if (node.kind === SyntaxKind.IndexSignature) {
40147+ if (node.kind === SyntaxKind.IndexSignature && (modifier.kind !== SyntaxKind.StaticKeyword || !isClassLike(node.parent)) ) {
4011340148 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_an_index_signature, tokenToString(modifier.kind));
4011440149 }
4011540150 }
0 commit comments