我想声明一个最后一个参数始终是回调的函数。但是,当我这样做时:
interface Statement extends events.EventEmitter {
bind(...args, callback?:(err?:Error)=>void) : Statement;
}
我收到错误
error TS1014: Rest parameter must be last in list
typescript 是否可以将 Rest参数作为参数列表中的最后一个参数?有什么黑客可以帮我解决这个问题吗?
答案 0 :(得分:6)
TypeScript不支持此功能。您可以做的最好的是...args: any[]
,或者只使用具有更合理的参数排序的库。
答案 1 :(得分:2)
rest parameter
的TypeScript规范与ES6&#39对齐:它是参数列表中的 last arg。你应该改变你的论点顺序。
:
签名的参数列表由零个或多个必需参数组成,后跟零个或多个 可选参数,最后是可选的休息参数。
来自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
。
例如,使用前两个参数string
和number
声明一个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