天天看點

TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

除了使用可選參數或重載來建立可以接受各種固定參數計數的函數之外,我們還可以使用剩餘參數定義具有無限數量參數的函數。rest 參數出現在所有其他參數之後,并使用 … 文法:

看個例子:

function multiply(n: number, ...m: number[]) {
  return m.map((x) => n * x);
}

function multiplyArray(n: number, m: number[]) {
  return m.map((x) => n * x);
}

const a = multiply(10, 1, 2, 3, 4);
console.log(a);

const b = multiply(10, [1,2,3,4]);
console.log(b);

const c = multiplyArray(10, [1,2,3,4]);
console.log(c);
      
TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

如果需求是允許傳入多個數組,該怎麼寫?

type JerryArray = number[];

function multiply(n: number, ...m: JerryArray[]) {
  return m.map( (stillArray) => stillArray.map((x) => n * x ));
}

const b = multiply(10, [1,2,3,4], [5,6,7,8]);
console.log(b);

      
TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

注意:rest parameter 的類型,必須為數組類型。

在 TypeScript 中,這些參數上的類型注解是隐式的 any[] 而不是 any,并且給出的任何類型注解都必須是 Array 或 T[] 的形式,或者是元組類型。

1

如果把三個點去掉,文法錯誤,因為數組的 push 方法,輸入參數不能是數組:

TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

而應該是 number 的序列:

TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

把 push 的輸入參數從數組,改成 4,5,6,7這種 number 序列就能夠正常工作了:

TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

spread 操作符的結果不能直接賦給一個變量,必須用數組包一層。

6
TypeScript 使用三個點号表示的 Rest 參數文法和 spread syntax

繼續閱讀