[英]TypeScript declaration file for function with variable number/type of arguments
headjs 對其 API 做了一些非常瘋狂的 JavaScript 類型的事情。 例如,一個函數需要任意數量的字符串(不是字符串數組)。 有時它會結束同一個函數調用,例如,您可以選擇用一個函數來結束它。
head.js("scripturl1", "scripturl2",...,callback);
您也可以(同樣輕松)執行以下操作
head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback);
我的問題是我們如何在聲明文件中描述它? 我全神貫注,因為我目前的通行證似乎完全錯誤。
TS 語言規范將可變數量/傳播參數稱為“其余參數”。 具有接受其余參數的函數簽名的示例接口:
interface IExample {
fn : (...args : any[]) => any;
}
var x : IExample = {
fn: function(...args : any[]) {
for (var i = 0, arg; arg = args[i]; i++) {
console.log(arg);
}
}
}
x.fn(1);
x.fn(1, 2);
x.fn("cat", "dog", "mouse");
不幸的是,有一些限制。 “Rest Parameter” 必須是函數簽名中的最后一個——因此您將無法捕獲回調參數的類型,因為它在重復參數之后。
如果不是,您將能夠執行以下操作:
var fn = function(cb: Function, ...args : string[]) {
...
}
您可以執行以下操作:
type Action<T extends any[]> = (...args: T) => void
聲明很簡單:
function foo () { //...
Javascript 中函數聲明的函數參數部分只是建議性的。 調用函數時,Javascript 允許您使用少於聲明數量的參數(未傳入的參數默認為undefined
)或多於聲明的參數數量進行調用。
調用函數時,會創建一個參數對象。 arguments 對象有點像一個數組(盡管它不是一個合適的 Array 對象),它保存每個傳入的參數。
因此,例如,要處理無限參數,您可以簡單地執行以下操作:
function foo () {
for (var n=0; n<arguments.length; n++) {
alert(arguments[n]);
}
}
所以現在你可以像這樣調用foo
:
foo(1,2,3);
foo(1,2,3,4,5,6,7,8);
除此之外,只需使用typeof 、 itstanceof等來檢測傳入的參數類型並相應地處理它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.