在typescript函数中展开数组:错误TS2556

ddarikpa  于 2023-01-21  发布在  TypeScript
关注(0)|答案(5)|浏览(665)

我尝试在一个类型脚本函数调用中使用spread运算符,如下所示:

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

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

增编:当我的参数是动态数组时,我该如何处理这个问题呢?

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

nlejzf6q1#

编辑动态生成的args
选项一:如果你确信args总是3元素元组,那么使用类型Assert。

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的旧答案
您可以将argsAssert为const:

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

Playground
或者按照错误提示将args定义为tuple:

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

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

vd2z7a6w

vd2z7a6w2#

你可以使用const assertion来解决这个问题,因为函数foo需要3个参数:

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

const args = [0, 1, 2] as const;
foo(...args);
sulc1iza

sulc1iza3#

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

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);
dsf9zpds

dsf9zpds4#

对于动态推断的参数大小,as const方法不起作用。
另一个解决方案是在.apply()调用中使用...args产生的数组,Typescript不会对此进行抱怨:

export class CustomError<
  ErrorCode extends keyof typeof CustomError.codes,
  ErrorParams extends Parameters<typeof CustomError.codes[ErrorCode]>
> extends Error {
  constructor(public code: ErrorCode, ...args: ErrorParams) {
    super(CustomError.codes[code].apply(null, args))
  }

  static codes = {
    invalidEmail (email: string) {
      return `Email ${email} is invalid`
    },
    invalidPasswordConfirm: (a: string, b: string) {
      return `Password ${a} and confirm ${b} are different`
    }
  }
}

new CustomError('invalidEmail', 'aaa@bbb')
// ^ CustomError(code: "invalidEmail", email: string)
new CustomError('invalidPasswordConfirm', 'first', 'second')
// ^ CustomError(code: "invalidPasswordConfirm", a: string, b: string)
mqxuamgl

mqxuamgl5#

无论是谁遇到A spread argument must either have a tuple type or be passed to a rest parameter.,您都可能需要检查typescript-parser是否安装在devDependencies中。

相关问题