具有可变参数计数的函数的TypeScript类型签名

nxn*_*nxn 96 typescript

我无法定义接受可变数量参数的函数成员的接口.以下面的对象文字为例:

var obj = {
    func: () => {
        for(var i = 0; i < arguments.length; i++) {
            console.log(arguments[i]);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我希望能够定义一个界面,例如:

interface IExample {
    func: ( ??? ) => void;
}
Run Code Online (Sandbox Code Playgroud)

这样下面的代码可以编译而不会出错:

var test = (o: IExample) {
    o.func("a");
    o.func("a", "b");
    o.func("a", "b", "c");
    ...
}
Run Code Online (Sandbox Code Playgroud)

chu*_*ckj 176

TypeScript使用ECMAScript 6传播提议,

http://wiki.ecmascript.org/doku.php?id=harmony:spread

但添加了类型注释,所以这看起来像,

interface Example {
    func(...args: any[]): void;
}
Run Code Online (Sandbox Code Playgroud)

  • @JanusTroelsen我意识到我已经很晚了但是对于那些偶然发现这篇文章的人来说,请确保你不要忘记将RestParameter标记为数组.`... args:any []`是正确的但是`... args:any`不是. (5认同)
  • @nxn规格中的第50/51页:RestParameter (3认同)

Ser*_*gan 6

只是为了添加到查克的答案中,您不需要定义这样的接口。您可以...直接在方法中执行:

class Header { constructor(public name: string, public value: string) {} }

getHeaders(...additionalHeaders: Header[]): HttpHeaders {
    let headers = new HttpHeaders();
    headers.append('Content-Type', 'application/json')

    if (additionalHeaders && additionalHeaders.length)
        for (var header of additionalHeaders)
            headers.append(header.name, header.value);

    return headers;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以调用它:

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()))
Run Code Online (Sandbox Code Playgroud)

或者

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
Run Code Online (Sandbox Code Playgroud)