Podpisy typ maszynopis dla funkcji ze zmienną liczbą argumentów

głosy
61

Mam problemy definiujący interfejsy z członków funkcyjnych, które akceptują różne ilości argumentów. Weźmy następujący literał obiektu jako przykład:

var obj = {
    func: () => {
        for(var i = 0; i < arguments.length; i++) {
            console.log(arguments[i]);
        }
    }
};

Chciałbym być w stanie zdefiniować interfejs, takich jak:

interface IExample {
    func: ( ??? ) => void;
}

Tak, że następujący kod można skompilować bez błędów:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
Utwórz 05/10/2012 o 04:40
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
106

Maszynopis wykorzystuje rozprzestrzenianiu propozycję ECMAScript 6,

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

ale dodaje wpisać adnotacje tak będzie to wyglądać,

interface IExample {
    func(...args: any[]): void;
}
Odpowiedział 05/10/2012 o 04:53
źródło użytkownik

głosy
2

Wystarczy dodać do odpowiedzi Chuck, nie trzeba mieć interfejs zdefiniowany jako taki. Można po prostu zrobić to ...bezpośrednio w metodzie:

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;
}

Następnie można nazwać:

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()))

Lub

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
Odpowiedział 04/02/2018 o 12:49
źródło użytkownik

głosy
0

Jeśli ... args [] Argument ten nie jest używany maszynopis nadal tworzy tablicę w JavaScript i kopiuje argumenty do niego.

Aby tego uniknąć unnecessariness można zrobić prototyp dla funkcji, jak i funkcji, a więc: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Odpowiedział 21/05/2018 o 14:34
źródło użytkownik

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