使用 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 传播休息抱怨调用目标的签名的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 抱怨 HTMLElement 没有 value 属性

反应休息参数语法与传播语法

反应传播运算符(...休息)的替代品?

如何绕过 ESLint 调用 Typescript 中未定义的 Geolocation 接口?

javascript 传播和休息运营商

React 中休息道具的 TypeScript 解决方法