39

headjs 对其 API 做了一些非常疯狂的 JavaScript 类型操作。例如,函数需要任意数量的字符串(不是字符串数组)。有时它会结束同一个函数调用,例如,您可以选择用函数结束它。

head.js("scripturl1", "scripturl2",...,callback);

您还可以(同样轻松地)执行以下操作

head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback);

我的问题是我们如何在声明文件中描述它?我全神贯注,因为我目前的通行证似乎完全错误。

4

3 回答 3

64

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[]) {
    ...
}
于 2012-10-16T04:12:12.210 回答
1

您可以执行以下操作:

type Action<T extends any[]> = (...args: T) => void
于 2021-02-12T16:31:43.893 回答
-5

声明很简单:

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等来检测传入的参数类型并相应地处理它们。

于 2012-10-16T03:30:06.100 回答