Сигнатуры типа TypeScript для функций с переменным количеством аргументов



у меня возникли проблемы с определением интерфейсов с членами функций, которые принимают переменное количество аргументов. Возьмем в качестве примера следующий объектный литерал:



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

3 ответов:

TypeScript использует предложение ECMAScript 6 spread,

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

но добавляет аннотации типа, так что это будет выглядеть,

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

просто чтобы добавить к ответу Чака, вам не нужно иметь интерфейс, определенный как таковой. Вы можете просто сделать ... непосредственно в методе:

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

Если ...аргумент 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]);
}

Comments

    Ничего не найдено.