// ElementList: ( Modified ) // Elisionopt AssignmentExpression // Elisionopt SpreadElement // ElementList, Elisionopt AssignmentExpression // ElementList, Elisionopt SpreadElement // SpreadElement: // ... AssignmentExpression var a0 = [,, 2, 3, 4] var a1 = ["hello", "world"] var a2 = [, , , ...a0, "hello"]; var a3 = [,, ...a0] var a4 = [() => 1, ]; var a5 = [...a0, , ] // Each element expression in a non-empty array literal is processed as follows: // - If the array literal contains no spread elements, and if the array literal is contextually typed (section 4.19) // by a type T and T has a property with the numeric name N, where N is the index of the element expression in the array literal, // the element expression is contextually typed by the type of that property. // The resulting type an array literal expression is determined as follows: // - If the array literal contains no spread elements and is contextually typed by a tuple-like type, // the resulting type is a tuple type constructed from the types of the element expressions. var b0: [any, any, any] = [undefined, null, undefined]; var b1: [number[], string[]] = [[1, 2, 3], ["hello", "string"]]; // The resulting type an array literal expression is determined as follows: // - If the array literal contains no spread elements and is an array assignment pattern in a destructuring assignment (section 4.17.1), // the resulting type is a tuple type constructed from the types of the element expressions. var [c0, c1] = [1, 2]; // tuple type [number, number] var [c2, c3] = [1, 2, true]; // tuple type [number, number, boolean] // The resulting type an array literal expression is determined as follows: // - the resulting type is an array type with an element type that is the union of the types of the // non - spread element expressions and the numeric index signature types of the spread element expressions var temp = ["s", "t", "r"]; var temp1 = [1, 2, 3]; var temp2: [number[], string[]] = [[1, 2, 3], ["hello", "string"]]; var temp3 = [undefined, null, undefined]; var temp4 = []; interface myArray extends Array { } interface myArray2 extends Array { } var d0 = [1, true, ...temp,]; // has type (string|number|boolean)[] var d1 = [...temp]; // has type string[] var d2: number[] = [...temp1]; var d3: myArray = [...temp1]; var d4: myArray2 = [...temp, ...temp1]; var d5 = [...temp3]; var d6 = [...temp4]; var d7 = [...[...temp1]]; var d8: number[][] = [[...temp1]] var d9 = [[...temp1], ...["hello"]];