参数列表中间的Typescript rest参数

时间:2014-02-26 13:35:09

标签: arguments typescript

我想声明一个最后一个参数始终是回调的函数。但是,当我这样做时:

interface Statement extends events.EventEmitter {
    bind(...args, callback?:(err?:Error)=>void) : Statement;
}

我收到错误

error TS1014: Rest parameter must be last in list

typescript 是否可以将 Rest参数作为参数列表中的最后一个参数?有什么黑客可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:6)

TypeScript不支持此功能。您可以做的最好的是...args: any[],或者只使用具有更合理的参数排序的库。

答案 1 :(得分:2)

rest parameter的TypeScript规范与ES6&#39对齐:它是参数列表中的 last arg。你应该改变你的论点顺序。

来自TypeScript语言规范(#Parameter List)的

  

签名的参数列表由零个或多个必需参数组成,后跟零个或多个   可选参数,最后是可选的休息参数

来自ES6: rest parameters - Semantics

  

[[FormalParameters]]列表中的最后一个参数用于rest参数。在标准的内置ECMAScript对象中,只有Function对象实现[[HasRestParameters]]。

答案 2 :(得分:0)

虽然rest parameter必须是最后一个,但是您现在可以在TS 4.0中使用 variadic tuple types

type VarCallback<T extends any[]> = (...args: [...T, (err?: Error) => void]) => void

VarCallback确保 last 函数参数是回调类型(err?: Error) => void

例如,使用前两个参数stringnumber声明一个function type

type MyCallback = VarCallback<[string, number]>
// (a1: string, a2: number, a3: (err?: Error | undefined) => void) => void

const myCb: MyCallback = (s, n, cb) => {/* your implementation */ }
// s,n,cb are strongly typed now

Live code sample