Сигнатуры типа 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");
...
}
3 ответов:
TypeScript использует предложение ECMAScript 6 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