Javascript 参数数目/类型可变的函数的TypeScript声明文件

Javascript 参数数目/类型可变的函数的TypeScript声明文件,javascript,typescript,Javascript,Typescript,headjs对其API做了一些非常疯狂的JavaScript类型的事情。例如,一个函数需要任意数量的字符串(不是字符串数组)。有时它会结束同一个函数调用,例如,您可以选择使用函数结束它 head.js("scripturl1", "scripturl2",...,callback); 您还可以(同样容易)执行以下操作 head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback); 我的问题是我们如

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

head.js("scripturl1", "scripturl2",...,callback);
您还可以(同样容易)执行以下操作

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

我的问题是我们如何在声明文件中描述它?我在这里洗耳恭听,因为我目前的通行证似乎完全错了。

声明如下:

function foo () { //...
Javascript中函数声明的函数参数部分只是建议。调用函数时,Javascript允许您使用少于声明的参数数(未传入的参数默认为
未定义的
)或多于声明的参数数进行调用

调用函数时,将创建一个。arguments对象有点像保存每个传入参数的数组(尽管它不是一个正确的数组对象)

例如,要处理无限参数,您只需执行以下操作:

function foo () {
  for (var n=0; n<arguments.length; n++) {
    alert(arguments[n]);
  }
}

除此之外,只需使用等来检测传入的参数类型并进行相应处理。

TS语言规范将可变数量/排列参数称为“Rest参数”。具有接受rest参数的函数签名的示例接口:

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参数”必须是函数签名中的最后一个参数——因此您将无法捕获回调参数的类型,因为它位于重复参数之后

如果不是,你本来可以做这样的事情:

var fn = function(cb: Function, ...args : string[]) {
    ...
}

您可以执行以下操作:

type Action<T extends any[]> = (...args: T) => void
type Action=(…args:T)=>void

我理解这背后的javascript,但实际问题是针对TypeScript的。。。但是谢谢你的帖子:-)是的,我跟它聊了一会儿,得出了和你一样的结论。。真希望我能做一个…字符串:字符串[],回调:()=>无效,但不幸的是:-(…)谢谢你的帖子。实际上有一个更干净更好的解决方案,从技术上讲,它不是这个实际问题的答案(所以如果你必须的话,请向下投票),但更多的建议是:只把你的参数放在一个对象中。这样地。。。。myFunc(“param1”,“param2”,“varParam1”:4“varParam2”:3});这实际上是可读性更强的代码,如果您想为parameters对象声明一个接口,它可以与上面的代码一起干净地工作。也就是说,javascript在处理REST对象方面已经非常出色,您甚至不需要语言中的变量参数函数,也不需要TypeScrip@ClayFerguson当您有1到n个值(甚至可能是0到n个值?)与回调等其他参数一起传递给函数时,将使用…rest模式。例如:@AJP我想说的是,当您以对象的形式传递键/值对时,接受许多参数的函数有时更容易读取,因为您不必在读取代码时记住参数的“顺序”。我们都见过这样的方法:doSomething(真,假,假,真,真,0,10),在前面,这是一个反模式,imp。当然,一旦您使用键/值模式,就有可能拼写错误的键名,但这是可以解决的,使用常量或其他东西。或者在TypeScript中,甚至是参数集的“type”。我已经为此发布了一个示例,因为这是我在别处看到的一种(相当有用的)模式。
type Action<T extends any[]> = (...args: T) => void