【问题标题】:Spread rest with TypeScript complains about signature of call target使用 TypeScript 传播休息抱怨调用目标的签名
【发布时间】:2017-11-30 18:18:44
【问题描述】:

我有一个这样定义的函数:

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


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

TypeScript 抱怨我传递给makeSomething的参数

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

在仍然使用扩展语法的同时定义此类事情的正确方法是什么?

谢谢

【问题讨论】:

标签: javascript typescript


【解决方案1】:

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

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

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

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

如果您还想传递剩余的参数,只需在解构中添加一个 rest 参数:

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

【讨论】:

  • @alexmngn 怎么样?您正在呼唤您期望三个项目,这使您可以在没有三个项目时安全地处理错误。盲目地传递数组更像是一种黑客行为,因为您可能对makeSomething 撒谎,并且事情可能会在以后爆炸。
  • typescript 在我看来有点 hacky...(非常明显的 normal es6 功能)
猜你喜欢
  • 2021-09-29
  • 2017-08-07
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2018-05-18
相关资源
最近更新 更多