diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7bd8dfae88b..789f2bd8104 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13941,7 +13941,12 @@ namespace ts { error(name, Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(objectLiteralType), declarationNameToString(name)); } } - else if (property.kind !== SyntaxKind.SpreadAssignment) { + else if (property.kind === SyntaxKind.SpreadAssignment) { + if (property.expression.kind !== SyntaxKind.Identifier) { + error(property.expression, Diagnostics.An_object_rest_element_must_be_an_identifier); + } + } + else { error(property, Diagnostics.Property_assignment_expected); } } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 921c80eec08..ce5e59e509c 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1991,6 +1991,10 @@ "category": "Error", "code": 2700 }, + "An object rest element must be an identifier.": { + "category": "Error", + "code": 2701 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/src/compiler/transformers/destructuring.ts b/src/compiler/transformers/destructuring.ts index bba09710898..a8c00776741 100644 --- a/src/compiler/transformers/destructuring.ts +++ b/src/compiler/transformers/destructuring.ts @@ -328,8 +328,9 @@ namespace ts { bindingElements.push(p); } } - else if (i === properties.length - 1 && p.kind === SyntaxKind.SpreadAssignment) { - Debug.assert((p as SpreadAssignment).expression.kind === SyntaxKind.Identifier); + else if (i === properties.length - 1 && + p.kind === SyntaxKind.SpreadAssignment && + p.expression.kind === SyntaxKind.Identifier) { if (bindingElements.length) { emitRestAssignment(bindingElements, value, location, target); bindingElements = [];