【问题标题】:TypeScript type signatures for functions with variable argument counts具有可变参数计数的函数的 TypeScript 类型签名
【发布时间】:2012-10-05 03:40:37
【问题描述】:

我在定义带有接受可变数量参数的函数成员的接口时遇到了麻烦。以下面的对象字面量为例:

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");
    ...
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 使用 ECMAScript 6 传播提案,

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

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

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

    【讨论】:

    • 完美——由于某种原因,我无法在语言规范文档中找到任何关于此的内容,但它似乎工作得很好。谢谢。
    • @nxn 规范中的第 50/51 页:RestParameter
    • @PulsarBlow 啊,我不熟悉它们被称为休息参数。感谢您让我知道在规范中的何处可以找到它们。
    • @JanusTroelsen 我意识到我来晚了,但对于任何偶然发现这篇文章的人,请确保不要忘记将 RestParameter 标记为数组。 ...args:any[] 是正确的,但 ...args:any 不是。
    • @AlexanderMills func 是函数的名称。
    【解决方案2】:

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

    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"))
    

    【讨论】:

      【解决方案3】:

      如果不使用 ...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]);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        相关资源
        最近更新 更多