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

голоса
61

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

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);
    ...
}
Задан 05/10/2012 в 04:40
источник пользователем
На других языках...                            


3 ответов

голоса
106

Машинопись использует распространение предложения ECMAScript 6,

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

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

interface IExample {
    func(...args: any[]): void;
}
Ответил 05/10/2012 в 04:53
источник пользователем

голоса
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"))
Ответил 04/02/2018 в 12:49
источник пользователем

голоса
0

Если ... арг [] аргумент не используется машинопись все еще создает массив в JavaScript, и копирует аргументы к нему.

Чтобы избежать этого unnecessariness вы можете сделать прототип для функции, а также функции, таким образом: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Ответил 21/05/2018 в 14:34
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more