From 962935b51fb736eec746608daa9bf76110516b0f Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 23 May 2016 13:53:30 -0700 Subject: [PATCH] Address PR comments --- src/compiler/checker.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bac35ab937f..178f89460dc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6830,20 +6830,26 @@ namespace ts { symbol.parent = source.parent; symbol.type = type; symbol.target = source; - if (source.valueDeclaration) symbol.valueDeclaration = source.valueDeclaration; + if (source.valueDeclaration) { + symbol.valueDeclaration = source.valueDeclaration; + } return symbol; } - function updateTypeOfMembers(type: Type, update: (propertyType: Type) => Type) { + function transformTypeOfMembers(type: Type, f: (propertyType: Type) => Type) { const members: SymbolTable = {}; for (const property of getPropertiesOfObjectType(type)) { const original = getTypeOfSymbol(property); - const updated = update(original); + const updated = f(original); members[property.name] = updated === original ? property : createTransientSymbol(property, updated); }; return members; } + /** Mark an object literal as exempt from the excess properties check. + * Recursively mark object literal members as exempt. + * Leave signatures alone since they are not subject to the check. + */ function getRegularTypeOfObjectLiteral(type: Type): Type { if (!(type.flags & TypeFlags.FreshObjectLiteral)) { return type; @@ -6854,7 +6860,7 @@ namespace ts { } const resolved = type; - const members = updateTypeOfMembers(type, prop => prop.flags & TypeFlags.FreshObjectLiteral ? getRegularTypeOfObjectLiteral(prop) : prop); + const members = transformTypeOfMembers(type, prop => prop.flags & TypeFlags.FreshObjectLiteral ? getRegularTypeOfObjectLiteral(prop) : prop); const regularNew = createAnonymousType(resolved.symbol, members, resolved.callSignatures, @@ -6867,7 +6873,7 @@ namespace ts { } function getWidenedTypeOfObjectLiteral(type: Type): Type { - const members = updateTypeOfMembers(type, prop => { + const members = transformTypeOfMembers(type, prop => { const widened = getWidenedType(prop); return prop === widened ? prop : widened; });