@@ -30142,7 +30142,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3014230142 const allPropertiesTable = strictNullChecks ? createSymbolTable() : undefined;
3014330143 let propertiesTable = createSymbolTable();
3014430144 let propertiesArray: Symbol[] = [];
30145- let computedNameTypes: Type[] = [] ;
30145+ let indexKeyTypes = new Set<Type>() ;
3014630146 let spread: Type = emptyObjectType;
3014730147
3014830148 pushCachedContextualType(node);
@@ -30156,9 +30156,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3015630156 const isJSObjectLiteral = !contextualType && isInJavascript && !enumTag;
3015730157 let objectFlags: ObjectFlags = freshObjectLiteralFlag;
3015830158 let patternWithComputedProperties = false;
30159- let hasComputedStringProperty = false;
30160- let hasComputedNumberProperty = false;
30161- let hasComputedSymbolProperty = false;
3016230159
3016330160 // Spreads may cause an early bail; ensure computed names are always checked (this is cached)
3016430161 // As otherwise they may not be checked until exports for the type at this position are retrieved,
@@ -30255,10 +30252,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3025530252 spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, objectFlags, inConstContext);
3025630253 propertiesArray = [];
3025730254 propertiesTable = createSymbolTable();
30258- computedNameTypes = [];
30259- hasComputedStringProperty = false;
30260- hasComputedNumberProperty = false;
30261- hasComputedSymbolProperty = false;
30255+ indexKeyTypes = new Set();
3026230256 }
3026330257 const type = getReducedType(checkExpression(memberDecl.expression, checkMode & CheckMode.Inferential));
3026430258 if (isValidSpreadType(type)) {
@@ -30290,17 +30284,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3029030284
3029130285 if (computedNameType && !isTypeUsableAsPropertyName(computedNameType)) {
3029230286 if (isPatternLiteralType(computedNameType)) {
30293- computedNameTypes.push (computedNameType);
30287+ indexKeyTypes.add (computedNameType);
3029430288 }
3029530289 else if (isTypeAssignableTo(computedNameType, stringNumberSymbolType)) {
3029630290 if (isTypeAssignableTo(computedNameType, numberType)) {
30297- hasComputedNumberProperty = true ;
30291+ indexKeyTypes.add(numberType) ;
3029830292 }
3029930293 else if (isTypeAssignableTo(computedNameType, esSymbolType)) {
30300- hasComputedSymbolProperty = true ;
30294+ indexKeyTypes.add(esSymbolType) ;
3030130295 }
3030230296 else {
30303- hasComputedStringProperty = true ;
30297+ indexKeyTypes.add(stringType) ;
3030430298 }
3030530299 if (inDestructuringPattern) {
3030630300 patternWithComputedProperties = true;
@@ -30355,9 +30349,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3035530349 spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, objectFlags, inConstContext);
3035630350 propertiesArray = [];
3035730351 propertiesTable = createSymbolTable();
30358- computedNameTypes = [];
30359- hasComputedStringProperty = false;
30360- hasComputedNumberProperty = false;
30352+ indexKeyTypes = new Set();
3036130353 }
3036230354 // remap the raw emptyObjectType fed in at the top into a fresh empty object literal type, unique to this use site
3036330355 return mapType(spread, t => t === emptyObjectType ? createObjectLiteralType() : t);
@@ -30366,14 +30358,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3036630358 return createObjectLiteralType();
3036730359
3036830360 function createObjectLiteralType() {
30369- let indexInfos: IndexInfo[] = [];
30370- for (const computedNameType of computedNameTypes) {
30371- const indexInfo = getObjectLiteralIndexInfo(offset, propertiesArray, computedNameType, /*isReadonly*/ inConstContext);
30372- indexInfos = appendIndexInfo(indexInfos, indexInfo, /*union*/ true);
30361+ const indexInfos: IndexInfo[] = [];
30362+ for (const keyType of indexKeyTypes) {
30363+ indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, keyType, /*isReadonly*/ inConstContext));
3037330364 }
30374- if (hasComputedStringProperty) indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, stringType, /*isReadonly*/ inConstContext));
30375- if (hasComputedNumberProperty) indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, numberType, /*isReadonly*/ inConstContext));
30376- if (hasComputedSymbolProperty) indexInfos.push(getObjectLiteralIndexInfo(offset, propertiesArray, esSymbolType, /*isReadonly*/ inConstContext));
3037730365 const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, indexInfos);
3037830366 result.objectFlags |= objectFlags | ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectOrArrayLiteral;
3037930367 if (isJSObjectLiteral) {
0 commit comments