在打字稿函数中传播数组:错误 TS2556

Spreading an array in a typescript function: Error TS2556

我正尝试在这样的打字稿函数调用中使用展开运算符:

function foo(x: number, y: number, z: number) {
  console.log(x + y + z);
}
const args = [0, 1, 2];
foo(...args);

但在编译时,我收到错误:“传播参数必须具有元组类型或传递给剩余参数”(TS2556)。我做错了什么?

附录:当我的参数是一个动态数组时,我该如何解决这个问题,如

const args = new Array(3).map(() => Math.random());

编辑动态生成 args:

选项一:如果您确定 args 将始终是 3 个元素的元组,请使用类型断言。

const args = new Array(3).map(() => Math.random()) as [number, number, number];

方案二,定义foo接受rest参数:

function foo(...args: number[]) {
  console.log(args[0] + args[1] + args[2]);
}
const args = new Array(3).map(() => Math.random());
foo(...args);

预定义的旧答案 args

您可以将 args 断言为常量:

const args = [0, 1, 2] as const;

Playground

或按照错误提示将 args 定义为元组:

const args: [number, number, number] = [0, 1, 2];

Playground

这是为了保证 args 中元素的数量/类型始终与函数参数的要求相匹配。

参数不是那样工作的,这就是你应该如何处理它们的参数

function multiply(n, ...m) {
    return m.map((x) => n * x);
}
// 'a' gets value [10, 20, 30, 40]
const a = multiply(10, 1, 2, 3, 4);

遇到 A spread argument must either have a tuple type or be passed to a rest parameter. 的人,您可能需要检查您的 devDependencies 中是否安装了 typescript-parser