// @downlevelIteration: true /* AssignmentPattern: * ObjectAssignmentPattern * ArrayAssignmentPattern * ArrayAssignmentPattern: * [Elision AssignmentRestElementopt ] * [AssignmentElementList] * [AssignmentElementList, Elision AssignmentRestElementopt ] * AssignmentElementList: * Elision AssignmentElement * AssignmentElementList, Elisionopt AssignmentElement * AssignmentElement: * LeftHandSideExpression Initialiseropt * AssignmentPattern Initialiseropt * AssignmentRestElement: * ... LeftHandSideExpression */ // In a destructuring assignment expression, the type of the expression on the right must be assignable to the assignment target on the left. // An expression of type S is considered assignable to an assignment target V if one of the following is true // V is an array assignment pattern, S is the type Any or an array-like type (section 3.3.2), and, for each assignment element E in V, // S is the type Any, or var [a0, a1] = undefined; var [a2 = false, a3 = 1] = undefined; // V is an array assignment pattern, S is the type Any or an array-like type (section 3.3.2), and, for each assignment element E in V, // S is a tuple- like type (section 3.3.3) with a property named N of a type that is assignable to the target given in E, // where N is the numeric index of E in the array assignment pattern, or var [b0, b1, b2] = [ 2, 3, 4 ]; var [b3, b4, b5] = [ 1, 2, "string" ]; function foo() { return [ 1, 2, 3 ]; } var [b6, b7] = foo(); var [...b8] = foo(); // S is not a tuple- like type and the numeric index signature type of S is assignable to the target given in E. var temp = [ 1, 2, 3 ]; var [c0, c1] = [ ...temp ]; var [c2] = []; var [[[c3]], [[[[c4]]]]] = [ [ [] ], [ [ [ [] ] ] ] ]; var [[c5], c6] = [ [ 1 ], true ]; var [, c7] = [ 1, 2, 3 ]; var [, , , c8] = [ 1, 2, 3, 4 ]; var [, , , c9] = [ 1, 2, 3, 4 ]; var [, , , ...c10] = [ 1, 2, 3, 4, "hello" ]; var [c11, c12, ...c13] = [ 1, 2, "string" ]; var [c14, c15, c16] = [ 1, 2, "string" ];