使用TypeScript传播休息会抱怨调用目标的签名

时间:2017-06-27 15:45:26

标签: javascript typescript

我有一个以这种方式定义的函数:

function create(element1: number, ...otherElements: any[]) {
  // Do something
  return makeSomething(...otherElements)
}


function makeSomething(a: string, b: number, c: IElements) {
  // Do something
}

TypeScript抱怨我传递给makeSomething

的参数
  

错误TS2346:提供的参数与任何调用签名都不匹配   目标

在使用扩展语法的同时定义此类内容的正确方法是什么?

由于

1 个答案:

答案 0 :(得分:4)

这里的一个问题是,Typescript不知道...otherElements: any[]中有多少项。即使项目类型(makeSomething)对参数有效,也无法保证将有3个项目传递给any

你可以通过告诉它实际上有3个元素来解决这个问题:

function create(element1: number, ...otherElements: any[]) {
  // Do something
  const [a, b, c] = otherElements;
  return makeSomething(a, b, c)
}

这允许您添加缺失的默认值,错误检查等,但最重要的是,有三个显式元素满足类型检查。

如果你想传递其余的参数,只需在destructure中添加一个rest参数:

function create(element1: number, ...otherElements: any[]) {
  // Do something
  const [a, b, c, ...d] = otherElements;
  return makeSomething(a, b, c, ...d)
}