13af6ab5fSopenharmony_ci#  It is possible to spread only arrays or classes derived from arrays into the rest parameter or array literals
23af6ab5fSopenharmony_ci
33af6ab5fSopenharmony_ciRule ``arkts-no-spread``
43af6ab5fSopenharmony_ci
53af6ab5fSopenharmony_ci**Severity: error**
63af6ab5fSopenharmony_ci
73af6ab5fSopenharmony_ciThe only supported scenario for the spread operator is to spread an array or
83af6ab5fSopenharmony_ciclass derived from array into the rest parameter or array literal.
93af6ab5fSopenharmony_ciOtherwise, manually "unpack" data from arrays and objects, where necessary.
103af6ab5fSopenharmony_ciAll typed arrays from the standard library (for example, ``Int32Array``)
113af6ab5fSopenharmony_ciare also supported.
123af6ab5fSopenharmony_ci
133af6ab5fSopenharmony_ci
143af6ab5fSopenharmony_ci## TypeScript
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci
173af6ab5fSopenharmony_ci```
183af6ab5fSopenharmony_ci
193af6ab5fSopenharmony_ci    function foo(x : number, y : number, z : number) {
203af6ab5fSopenharmony_ci        console.log(x, y, z)
213af6ab5fSopenharmony_ci    }
223af6ab5fSopenharmony_ci
233af6ab5fSopenharmony_ci    let args : [number, number, number] = [0, 1, 2]
243af6ab5fSopenharmony_ci    foo(...args)
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_ci    let list1 = [1, 2]
273af6ab5fSopenharmony_ci    let list2 = [...list1, 3, 4]
283af6ab5fSopenharmony_ci
293af6ab5fSopenharmony_ci    let point2d = {x: 1, y: 2}
303af6ab5fSopenharmony_ci    let point3d = {...point2d, z: 3}
313af6ab5fSopenharmony_ci
323af6ab5fSopenharmony_ci```
333af6ab5fSopenharmony_ci
343af6ab5fSopenharmony_ci## ArkTS
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_ci
373af6ab5fSopenharmony_ci```
383af6ab5fSopenharmony_ci
393af6ab5fSopenharmony_ci    function sum_numbers(...numbers: number[]): number {
403af6ab5fSopenharmony_ci        let res = 0
413af6ab5fSopenharmony_ci        for (let n of numbers)
423af6ab5fSopenharmony_ci            res += n
433af6ab5fSopenharmony_ci        return res
443af6ab5fSopenharmony_ci    }
453af6ab5fSopenharmony_ci    console.log(sum_numbers(1, 2, 3))
463af6ab5fSopenharmony_ci
473af6ab5fSopenharmony_ci    function log_numbers(x : number, y : number, z : number) {
483af6ab5fSopenharmony_ci        console.log(x, y, z)
493af6ab5fSopenharmony_ci    }
503af6ab5fSopenharmony_ci    let numbers: number[] = [1, 2, 3]
513af6ab5fSopenharmony_ci    log_numbers(numbers[0], numbers[1], numbers[2])
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_ci    let list1 : number[] = [1, 2]
543af6ab5fSopenharmony_ci    let list2 : number[] = [list1[0], list1[1], 3, 4]
553af6ab5fSopenharmony_ci
563af6ab5fSopenharmony_ci    class Point2D {
573af6ab5fSopenharmony_ci        x: number = 0; y: number = 0
583af6ab5fSopenharmony_ci    }
593af6ab5fSopenharmony_ci
603af6ab5fSopenharmony_ci    class Point3D {
613af6ab5fSopenharmony_ci        x: number = 0; y: number = 0; z: number = 0
623af6ab5fSopenharmony_ci        constructor(p2d: Point2D, z: number) {
633af6ab5fSopenharmony_ci            this.x = p2d.x
643af6ab5fSopenharmony_ci            this.y = p2d.y
653af6ab5fSopenharmony_ci            this.z = z
663af6ab5fSopenharmony_ci        }
673af6ab5fSopenharmony_ci    }
683af6ab5fSopenharmony_ci
693af6ab5fSopenharmony_ci    let p3d = new Point3D({x: 1, y: 2} as Point2D, 3)
703af6ab5fSopenharmony_ci    console.log(p3d.x, p3d.y, p3d.z)
713af6ab5fSopenharmony_ci
723af6ab5fSopenharmony_ci    class DerivedFromArray extends Uint16Array {};
733af6ab5fSopenharmony_ci
743af6ab5fSopenharmony_ci    let arr1 = [1, 2, 3];
753af6ab5fSopenharmony_ci    let arr2 = new Uint16Array([4, 5, 6]);
763af6ab5fSopenharmony_ci    let arr3 = new DerivedFromArray([7, 8, 9])
773af6ab5fSopenharmony_ci    let arr4 = [...arr1, 10, ...arr2, 11, ...arr3]
783af6ab5fSopenharmony_ci
793af6ab5fSopenharmony_ci```
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_ci
82