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

Mar*_*.H. 19 typescript spread-syntax

我正在尝试在打字稿函数调用上使用扩展运算符,如下所示:

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

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

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

const args = new Array(3).map(() => Math.random());
Run Code Online (Sandbox Code Playgroud)

Psi*_*dom 25

编辑动态生成args

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

const args = new Array(3).map(() => Math.random()) as [number, number, number];
Run Code Online (Sandbox Code Playgroud)

选项二,定义foo接受剩余参数:

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

预定义的旧答案args

您可以将 args 断言为 const:

const args = [0, 1, 2] as const;
Run Code Online (Sandbox Code Playgroud)

操场

或者按照错误建议将 args 定义为元组:

const args: [number, number, number] = [0, 1, 2];
Run Code Online (Sandbox Code Playgroud)

操场

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


Ali*_*N11 5

您可以使用const 断言来解决该问题。因为该函数foo需要 3 个参数:

function foo(x: number, y: number, z: number) {
  console.log(x + y + z);
}

const args = [0, 1, 2] as const;
foo(...args);
Run Code Online (Sandbox Code Playgroud)