使用 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 属性