传播参数必须具有元组类型或传递给剩余参数

spread 参数必须具有元组类型或传递给 rest 参数

A spread argument must either have a tuple type or be passed to a rest parameter

当我们将 spread 语法与需要固定数量参数的函数一起使用时,会出现错误“A spread argument must either have a tuple type or be passed to a rest parameter”。

要解决该错误,请使用元组而不是数组或键入函数以使用剩余参数。

下面是错误如何发生的示例。

索引.ts
function getObj(name: string, age: number) { return { name, age, }; } // ⛔️ Error: A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556) const result = getObj(...['Bobby Hadz', 30]);

错误的原因是该getObj函数有 2 个参数 – a
string和 a并且我们在数组上使用扩展语法 (…)number调用它

TypeScript 告诉我们,不能保证数组中的2第一个元素是 a而第二个元素是 a stringnumber

使用 const 断言解决错误

为了解决这个问题,您可以使用const 断言
将数组作为
tuple传递。

索引.ts
function getObj(name: string, age: number) { return { name, age, }; } const result = getObj(...(['Bobby Hadz', 30] as const));

as const语法将数组转换为只读元组。

索引.ts
// 👇️ const tuple: readonly ["James", 30] const tuple = ['James', 30] as const;

现在我们正在使用一个元组,TypeScript 知道我们正在解压缩一个只有2元素的数组,其中第一个元素是字符串,第二个元素是数字。

将数组键入为元组以解决错误

您还可以将数组显式键入为元组以获得相同的结果。

索引.ts
function getObj(name: string, age: number) { return { name, age, }; } // 👇️ declare tuple instead of array const myTuple: [string, number] = ['Bobby Hadz', 30]; const result = getObj(...myTuple); console.log(result); // 👉️ { name: 'Bobby Hadz', age: 30 }

我们声明了一个包含 2 个元素的元组——一个字符串和一个数字。这与函数期望接受的参数完全匹配,因此我们可以在函数调用中使用扩展语法 (…)。

使用rest参数解决错误


另一种方法是在函数定义中
使用
剩余参数,并将函数更改为采用无限数量的参数。

索引.ts
function getArr(...args: string[]) { return args; } const result = getArr(...['James', 'Alice', 'Bobby Hadz', 'Carl']); console.log(result); // 👉️ ['James', 'Alice', 'Bobby Hadz', 'Carl']

我们
在函数的定义中使用了一个
剩余参数。

剩余参数用于参数数量不定的函数。

您可以想象该...args语法会将传入的参数分组到一个数组中。

索引.ts
function getArr(...args: string[]) { console.log(args); // 👉️ ['James', 'Alice', 'Bobby Hadz', 'Carl'] return args; } const result = getArr(...['James', 'Alice', 'Bobby Hadz', 'Carl']);

代码示例使用
剩余参数
语法(调用
getArr函数时)。

该语法将数组解压缩为函数调用中以逗号分隔的参数。

它还使用剩余参数(在定义函数时)将所有传入的参数分组到一个名为args.