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

Posted

技术标签:

【中文标题】使用 TypeScript 传播休息抱怨调用目标的签名【英文标题】:Spread rest with TypeScript complains about signature of call target 【发布时间】: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:提供的参数与调用的任何签名都不匹配 目标。

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

谢谢

【问题讨论】:

***.com/q/34179897/6304441的可能重复 @dogui 这张票只指数字类型的参数,我的情况是关于作为参数传递的不同类型 【参考方案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 功能)

以上是关于使用 TypeScript 传播休息抱怨调用目标的签名的主要内容,如果未能解决你的问题,请参考以下文章