Skip to content

Commit b688e25

Browse files
committed
Implement inferrable index signatures for enum types
1 parent de96b41 commit b688e25

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7299,7 +7299,8 @@ namespace ts {
72997299
stringIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false);
73007300
}
73017301
}
7302-
const numberIndexInfo = symbol.flags & SymbolFlags.Enum ? enumNumberIndexInfo : undefined;
7302+
const numberIndexInfo = symbol.flags & SymbolFlags.Enum && (getDeclaredTypeOfSymbol(symbol).flags & TypeFlags.Enum ||
7303+
some(type.properties, prop => !!(getTypeOfSymbol(prop).flags & TypeFlags.NumberLike))) ? enumNumberIndexInfo : undefined;
73037304
setStructuredTypeMembers(type, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
73047305
// We resolve the members before computing the signatures because a signature may use
73057306
// typeof with a qualified name expression that circularly references the type we are
@@ -8161,6 +8162,9 @@ namespace ts {
81618162
propTypes.push(getTypeOfSymbol(prop));
81628163
}
81638164
}
8165+
if (kind === IndexKind.String) {
8166+
append(propTypes, getIndexTypeOfType(type, IndexKind.Number));
8167+
}
81648168
if (propTypes.length) {
81658169
return getUnionType(propTypes, UnionReduction.Subtype);
81668170
}
@@ -14498,7 +14502,7 @@ namespace ts {
1449814502
* with no call or construct signatures.
1449914503
*/
1450014504
function isObjectTypeWithInferableIndex(type: Type) {
14501-
return type.symbol && (type.symbol.flags & (SymbolFlags.ObjectLiteral | SymbolFlags.TypeLiteral | SymbolFlags.ValueModule)) !== 0 &&
14505+
return type.symbol && (type.symbol.flags & (SymbolFlags.ObjectLiteral | SymbolFlags.TypeLiteral | SymbolFlags.Enum| SymbolFlags.ValueModule)) !== 0 &&
1450214506
!typeHasCallOrConstructSignatures(type);
1450314507
}
1450414508

0 commit comments

Comments
 (0)