簡體   English   中英

具有可變數量/類型參數的函數的 TypeScript 聲明文件

[英]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);

除此之外,只需使用typeofitstanceof等來檢測傳入的參數類型並相應地處理它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM