了解 TypeScript 0.9.5 中的剩余参数

Posted

技术标签:

【中文标题】了解 TypeScript 0.9.5 中的剩余参数【英文标题】:Understanding rest parameters in TypeScript 0.9.5 【发布时间】:2014-01-31 13:11:32 【问题描述】:

我正在使用 TypeScript 编写一个小型应用程序。它有一个上下文菜单模块,它有一个名为show的方法,声明如下:

export var show = function (position:  top: number; left: number; ,
    optionList:  [name: string]: (...params: any[]) => any )

所以基本上我想在某个位置显示菜单并传递一个将字符串映射到函数的对象 - 这些将是我的菜单中的项目和分配给它们的回调。我希望这些回调接受任意数量的任何类型的参数 - 这就是我理解我在这里使用的其余参数的方式。但是,当我尝试像这样调用我的函数时:

menu.show(
     
         top: nativeEvent.clientY,
         left: nativeEvent.clientX + 5
     ,
     
         "Add elem...": (e: JQueryEventObject) =>  
     );

我收到一条错误消息,提示 Call signatures of types '(e: JQueryEventObject) => void' and '(...params: any[]) => any' are incompatibleCall signature expects 0 or fewer parameters.

谁能告诉我这里发生了什么?因为事实证明我完全不理解剩余参数的概念。为什么编译器告诉我函数需要 0 个参数,我如何让它需要任意数量的参数?

【问题讨论】:

【参考方案1】:

由于其余参数意味着所有成员都是可选的,因此您传入的函数必须将其所有成员都设为可选(e?: JQueryEventObject) => ,例如:

var show = function (position:  top: number; left: number; ,
    optionList:  [name: string]: (...params: any[]) => any )

show(
     
         top: 1,
         left: 5
     ,
     
         "Add elem...": (e?: any) =>   // Notice e is optional
     );    

【讨论】:

对。我查看了规范并以某种方式错过了它。 “在比较调用或构造签名时,参数名称被忽略,其余参数对应于其余参数元素类型的可选参数的无限扩展。”非常感谢。

以上是关于了解 TypeScript 0.9.5 中的剩余参数的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:如何为函数中的任何键键入对象剩余分布

15TypeScript-函数

如何在 TypeScript 3+ 中正确键入通用元组剩余参数?

StoreEnhancer 的 TypeScript 定义阻止了剩余参数

Typescript的函数

从0开始的TypeScriptの七:函数