@@ -6834,45 +6834,42 @@ namespace ts {
68346834 return symbol;
68356835 }
68366836
6837+ function updateTypeOfMembers(type: Type, update: (propertyType: Type) => Type) {
6838+ const members: SymbolTable = {};
6839+ for (const property of getPropertiesOfObjectType(type)) {
6840+ const original = getTypeOfSymbol(property);
6841+ const updated = update(original);
6842+ members[property.name] = updated === original ? property : createTransientSymbol(property, updated);
6843+ };
6844+ return members;
6845+ }
6846+
68376847 function getRegularTypeOfObjectLiteral(type: Type): Type {
6838- if (type.flags & TypeFlags.FreshObjectLiteral) {
6839- let regularType = (<FreshObjectLiteralType>type).regularType;
6840- if (!regularType) {
6841- regularType = <ResolvedType>createType((<ResolvedType>type).flags & ~TypeFlags.FreshObjectLiteral);
6842- regularType.symbol = (<ResolvedType>type).symbol;
6843- const members: SymbolTable = {};
6844- const properties: Symbol[] = [];
6845- for (let p of (<ResolvedType>type).properties) {
6846- const propType = getTypeOfSymbol(p);
6847- if (propType.flags & TypeFlags.FreshObjectLiteral) {
6848- p = createTransientSymbol(p, getRegularTypeOfObjectLiteral(propType));
6849- }
6850- members[p.name] = p;
6851- properties.push(p);
6852- };
6853- regularType.properties = properties;
6854- regularType.members = members;
6855- regularType.callSignatures = (<ResolvedType>type).callSignatures;
6856- regularType.constructSignatures = (<ResolvedType>type).constructSignatures;
6857- regularType.stringIndexInfo = (<ResolvedType>type).stringIndexInfo;
6858- regularType.numberIndexInfo = (<ResolvedType>type).numberIndexInfo;
6859- (<FreshObjectLiteralType>type).regularType = regularType;
6860- }
6848+ if (!(type.flags & TypeFlags.FreshObjectLiteral)) {
6849+ return type;
6850+ }
6851+ const regularType = (<FreshObjectLiteralType>type).regularType;
6852+ if (regularType) {
68616853 return regularType;
68626854 }
6863- return type;
6855+
6856+ const resolved = <ResolvedType>type;
6857+ const members = updateTypeOfMembers(type, prop => prop.flags & TypeFlags.FreshObjectLiteral ? getRegularTypeOfObjectLiteral(prop) : prop);
6858+ const regularNew = createAnonymousType(resolved.symbol,
6859+ members,
6860+ resolved.callSignatures,
6861+ resolved.constructSignatures,
6862+ resolved.stringIndexInfo,
6863+ resolved.numberIndexInfo);
6864+ regularNew.flags = resolved.flags & ~TypeFlags.FreshObjectLiteral;
6865+ (<FreshObjectLiteralType>type).regularType = regularNew;
6866+ return regularNew;
68646867 }
68656868
68666869 function getWidenedTypeOfObjectLiteral(type: Type): Type {
6867- const properties = getPropertiesOfObjectType(type);
6868- const members: SymbolTable = {};
6869- forEach(properties, p => {
6870- const propType = getTypeOfSymbol(p);
6871- const widenedType = getWidenedType(propType);
6872- if (propType !== widenedType) {
6873- p = createTransientSymbol(p, widenedType);
6874- }
6875- members[p.name] = p;
6870+ const members = updateTypeOfMembers(type, prop => {
6871+ const widened = getWidenedType(prop);
6872+ return prop === widened ? prop : widened;
68766873 });
68776874 const stringIndexInfo = getIndexInfoOfType(type, IndexKind.String);
68786875 const numberIndexInfo = getIndexInfoOfType(type, IndexKind.Number);
0 commit comments