type typescript handtekeningen voor functies met een variabele argument telt

stemmen
61

Ik heb problemen met het definiëren van interfaces met de functie leden die variabele hoeveelheden van argumenten te aanvaarden. Neem het volgende object letterlijke als een voorbeeld:

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

Ik zou graag in staat zijn om een ​​interface te definiëren, zoals:

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

Zodat de volgende code kan compileren zonder fouten:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
De vraag is gesteld op 05/10/2012 om 04:40
bron van user
In andere talen...                            


3 antwoorden

stemmen
106

Typoscript maakt gebruik van de ECMAScript 6 spread voorstel,

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

maar voegt typeannotaties dus dit eruit zou zien,

interface IExample {
    func(...args: any[]): void;
}
antwoordde op 05/10/2012 om 04:53
bron van user

stemmen
2

Gewoon om toe te voegen aan het antwoord Chuck's, hoeft u niet om een interface gedefinieerd als zodanig. Je kunt gewoon doen het ...rechtstreeks in de methode:

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

Dan kunt u bellen met:

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

Of

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
antwoordde op 04/02/2018 om 12:49
bron van user

stemmen
0

Als de ... args [] argument niet wordt gebruikt Typescript creëert nog steeds een array in de Javascript en kopieert de argumenten aan.

Om te voorkomen dat dit unnecessariness kunt u een prototype te maken voor de functie, evenals de functie, als volgt: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
antwoordde op 21/05/2018 om 14:34
bron van user

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