Typoskript Typ Signaturen für Funktionen mit variabler zählt Argument

stimmen
61

Ich habe Probleme Definition von Schnittstellen mit Funktionselementen, die variable Mengen von Argumenten akzeptieren. Nehmen Sie das folgende Objektliteral als Beispiel:

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

Ich möchte in der Lage sein, eine Schnittstelle zu definieren, wie:

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

So dass der folgende Code, ohne Fehler kompilieren:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
Veröffentlicht am 05/10/2012 um 04:40
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
106

Typoskript verwendet die Ausbreitung Vorschlag ECMAScript 6,

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

sondern fügt Anmerkungen geben so das aussehen würde,

interface IExample {
    func(...args: any[]): void;
}
Beantwortet am 05/10/2012 um 04:53
quelle vom benutzer

stimmen
2

Nur hinzufügen Antwort auf Chucks, brauchen Sie nicht eine Schnittstelle als solche definiert haben. Sie können nur das tun ...in dem Verfahren direkt:

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

Dann können Sie es nennen:

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

Oder

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
Beantwortet am 04/02/2018 um 12:49
quelle vom benutzer

stimmen
0

Wenn die ... args [] Argument nicht Typoskript noch verwendet wird, erstellt ein Array in Javascript und kopiert die Argumente zu.

Um dies zu vermeiden unnecessariness Sie einen Prototyp für die Funktion machen kann, sowie die Funktion, also: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Beantwortet am 21/05/2018 um 14:34
quelle vom benutzer

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