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 。 string
number
使用 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
.