首页 文章

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

提问于
浏览
80

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

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

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

interface IExample {
    func: ( ??? ) => void;
}

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

var test = (o: IExample) {
    o.func("a");
    o.func("a", "b");
    o.func("a", "b", "c");
    ...
}

3 回答

  • 4

    TypeScript使用ECMAScript 6传播提议,

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

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

    interface Example {
        func(...args: any[]): void;
    }
    
  • 150

    只是要添加到chuck 's answer, you don' t需要有一个如此定义的接口 . 您可以直接在方法中执行 ...

    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;
    }
    

    然后你可以称之为:

    headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()))
    

    要么

    headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
    
  • 0

    如果未使用... args []参数,Typescript仍会在Javascript中创建一个数组并将参数复制到它 .

    为避免这种不必要,您可以为函数和函数制作原型,因此: -

    function format_n(str: string, ... $n: any[]): string;
    function format_n(str: string): string {
        return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
    }
    

相关问题