2014-02-26 23 views
2

我想聲明一個函數,它的最後一個參數總是回調函數。然而,當我這樣做:參數列表中的Typescript rest參數

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

我得到一個錯誤

error TS1014: Rest parameter must be last in list 

是否有可能在打字稿以HEVE 休息參數沒有參數列表最後PARAM?有什麼破解可以幫助我解決這個問題嗎?

回答

6

這在TypeScript中不受支持。你可以做的最好的是...args: any[],或者只使用更明智的參數排序的庫。

+0

我知道這是一個遠射,但隨着2014年2月以來的所有變化,現在有沒有更好的方法來破解它呢? RxJS的人們正在使用的方法,他們需要接受可變數量的可觀察量作爲第一組參數,以及不同類型的可選最終參數([here's](https://github.com/ReactiveX/RxJS/) blob/master/src/operator/concat.ts)一個例子)。 variadic種可能會在這裏幫助嗎? –

+0

現在,您可以爲其餘arg使用聯合類型,例如'function foo(first:string,... middleNumberAndFinalBoolean:Array )'。這比「任何」更安全。 –

2

rest parameter的TypeScript規範與ES6的對齊:它是參數列表中的最後一個 arg。你應該改變你的參數順序。

從打字稿語言規格(#Parameter列表):

簽名的參數列表由零個或多個必需的參數,其次是零個或多個 可選參數,最後跟着一個可選的其他參數

ES6: rest parameters - Semantics

在[[FormalParameters]]列出的最後一個參數被用於其餘參數。在標準的內置ECMAScript對象中,只有Function對象實現[[HasRestParameters]]。

+0

「你應該改變你的參數順序。」 - 祝你好運。爲Node庫編寫聲明,回調總是最後一個?這可能是成千上萬的庫需要重寫... – SomeCallMeTim