@@ -8580,8 +8580,8 @@ namespace ts {
8580
8580
if (merged) {
8581
8581
// note:we overwrite links because we just cloned the symbol
8582
8582
symbol = links = merged;
8583
- }
8584
-
8583
+ }
8584
+
8585
8585
const type = originalLinks.declaredType = links.declaredType = <InterfaceType>createObjectType(kind, symbol);
8586
8586
const outerTypeParameters = getOuterTypeParametersOfClassOrInterface(symbol);
8587
8587
const localTypeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
@@ -9611,6 +9611,7 @@ namespace ts {
9611
9611
// Combinations of function, class, enum and module
9612
9612
let members = emptySymbols;
9613
9613
let stringIndexInfo: IndexInfo | undefined;
9614
+ let numberIndexInfo: IndexInfo | undefined;
9614
9615
if (symbol.exports) {
9615
9616
members = getExportsOfSymbol(symbol);
9616
9617
if (symbol === globalThisSymbol) {
@@ -9623,6 +9624,7 @@ namespace ts {
9623
9624
members = varsOnly;
9624
9625
}
9625
9626
}
9627
+ let baseConstructorIndexInfo: IndexInfo | undefined;
9626
9628
setStructuredTypeMembers(type, members, emptyArray, emptyArray, undefined, undefined);
9627
9629
if (symbol.flags & SymbolFlags.Class) {
9628
9630
const classType = getDeclaredTypeOfClassOrInterface(symbol);
@@ -9632,11 +9634,21 @@ namespace ts {
9632
9634
addInheritedMembers(members, getPropertiesOfType(baseConstructorType));
9633
9635
}
9634
9636
else if (baseConstructorType === anyType) {
9635
- stringIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
9637
+ baseConstructorIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
9638
+ }
9639
+ }
9640
+
9641
+ const indexSymbol = getIndexSymbolFromSymbolTable(members);
9642
+ if (indexSymbol) {
9643
+ stringIndexInfo = getIndexInfoOfIndexSymbol(indexSymbol, IndexKind.String);
9644
+ numberIndexInfo = getIndexInfoOfIndexSymbol(indexSymbol, IndexKind.Number);
9645
+ }
9646
+ else {
9647
+ stringIndexInfo = baseConstructorIndexInfo;
9648
+ if (symbol.flags & SymbolFlags.Enum && (getDeclaredTypeOfSymbol(symbol).flags & TypeFlags.Enum || some(type.properties, prop => !!(getTypeOfSymbol(prop).flags & TypeFlags.NumberLike))) ) {
9649
+ numberIndexInfo = enumNumberIndexInfo;
9636
9650
}
9637
9651
}
9638
- const numberIndexInfo = symbol.flags & SymbolFlags.Enum && (getDeclaredTypeOfSymbol(symbol).flags & TypeFlags.Enum ||
9639
- some(type.properties, prop => !!(getTypeOfSymbol(prop).flags & TypeFlags.NumberLike))) ? enumNumberIndexInfo : undefined;
9640
9652
setStructuredTypeMembers(type, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
9641
9653
// We resolve the members before computing the signatures because a signature may use
9642
9654
// typeof with a qualified name expression that circularly references the type we are
@@ -9664,6 +9676,13 @@ namespace ts {
9664
9676
}
9665
9677
}
9666
9678
9679
+ function getIndexInfoOfIndexSymbol(indexSymbol: Symbol, indexKind: IndexKind) {
9680
+ const declaration = getIndexDeclarationOfIndexSymbol(indexSymbol, indexKind);
9681
+ if (!declaration) return undefined;
9682
+ return createIndexInfo(declaration.type ? getTypeFromTypeNode(declaration.type) : anyType,
9683
+ hasModifier(declaration, ModifierFlags.Readonly), declaration);
9684
+ }
9685
+
9667
9686
function resolveReverseMappedTypeMembers(type: ReverseMappedType) {
9668
9687
const indexInfo = getIndexInfoOfType(type.source, IndexKind.String);
9669
9688
const modifiers = getMappedTypeModifiers(type.mappedType);
@@ -11094,24 +11113,29 @@ namespace ts {
11094
11113
}
11095
11114
11096
11115
function getIndexSymbol(symbol: Symbol): Symbol | undefined {
11097
- return symbol.members!.get(InternalSymbolName.Index);
11116
+ return getIndexSymbolFromSymbolTable(symbol.members!);
11117
+ }
11118
+
11119
+ function getIndexSymbolFromSymbolTable(symbolTable: SymbolTable): Symbol | undefined {
11120
+ return symbolTable.get(InternalSymbolName.Index);
11098
11121
}
11099
11122
11100
11123
function getIndexDeclarationOfSymbol(symbol: Symbol, kind: IndexKind): IndexSignatureDeclaration | undefined {
11101
- const syntaxKind = kind === IndexKind.Number ? SyntaxKind.NumberKeyword : SyntaxKind.StringKeyword;
11102
11124
const indexSymbol = getIndexSymbol(symbol);
11103
- if (indexSymbol) {
11104
- for (const decl of indexSymbol.declarations) {
11105
- const node = cast(decl, isIndexSignatureDeclaration);
11106
- if (node.parameters.length === 1) {
11107
- const parameter = node.parameters[0];
11108
- if (parameter.type && parameter.type.kind === syntaxKind) {
11109
- return node;
11110
- }
11125
+ return indexSymbol && getIndexDeclarationOfIndexSymbol(indexSymbol, kind);
11126
+ }
11127
+
11128
+ function getIndexDeclarationOfIndexSymbol(indexSymbol: Symbol, kind: IndexKind): IndexSignatureDeclaration | undefined {
11129
+ const syntaxKind = kind === IndexKind.Number ? SyntaxKind.NumberKeyword : SyntaxKind.StringKeyword;
11130
+ for (const decl of indexSymbol.declarations) {
11131
+ const node = cast(decl, isIndexSignatureDeclaration);
11132
+ if (node.parameters.length === 1) {
11133
+ const parameter = node.parameters[0];
11134
+ if (parameter.type && parameter.type.kind === syntaxKind) {
11135
+ return node;
11111
11136
}
11112
11137
}
11113
11138
}
11114
-
11115
11139
return undefined;
11116
11140
}
11117
11141
@@ -36337,7 +36361,7 @@ namespace ts {
36337
36361
if (node.kind === SyntaxKind.PropertySignature || node.kind === SyntaxKind.MethodSignature) {
36338
36362
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_type_member, tokenToString(modifier.kind));
36339
36363
}
36340
- if (node.kind === SyntaxKind.IndexSignature) {
36364
+ if (node.kind === SyntaxKind.IndexSignature && modifier.kind !== SyntaxKind.StaticKeyword ) {
36341
36365
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_an_index_signature, tokenToString(modifier.kind));
36342
36366
}
36343
36367
}
0 commit comments