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

46qrfjad  于 2023-06-24  发布在  TypeScript
关注(0)|答案(3)|浏览(115)

我在定义函数成员的接口时遇到了问题,这些函数成员接受可变数量的参数。以下面的object literal为例:

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

h43kikqp1#

TypeScript使用ECMAScript 6扩展方案,
http://wiki.ecmascript.org/doku.php?id=harmony:spread
但添加了类型注解,所以看起来像

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

gfttwv5a2#

为了补充chuck的答案,你不需要定义一个接口。您可以直接在方法中执行...

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

ikfrs5lh3#

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

相关问题