Firme di tipo TypeScript per funzioni con conteggi di argomenti variabili


108

Ho problemi a definire le interfacce con i membri della funzione che accettano quantità variabili di argomenti. Prendi il seguente oggetto letterale come esempio:

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

Mi piacerebbe essere in grado di definire un'interfaccia come:

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

In modo che il codice seguente possa essere compilato senza errori:

var test = (o: IExample) {
    o.func("a");
    o.func("a", "b");
    o.func("a", "b", "c");
    ...
}

Risposte:


205

TypeScript utilizza la proposta di diffusione ECMAScript 6,

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

ma aggiunge annotazioni di tipo in modo che appaia come

interface Example {
    func(...args: any[]): void;
}

Perfetto: per qualche motivo non sono riuscito a trovare nulla su questo nel documento delle specifiche della lingua, ma sembra funzionare bene. Grazie.
nxn

4
@nxn Pagina 50/51 nelle specifiche: RestParameter
AM

@PulsarBlow Ah, non avevo familiarità con il fatto che si chiamassero parametri di riposo. Grazie per avermi fatto sapere dove trovarli nelle specifiche.
nxn

7
@JanusTroelsen Mi rendo conto di essere molto in ritardo, ma per chiunque si imbatta in questo post, assicurati di non dimenticare di contrassegnare RestParameter come array. ...args:any[]è corretto ma ...args:anynon lo è.
GuiSim

1
@AlexanderMills func è il nome della funzione.
Bob Vale

5

Solo per aggiungere alla risposta di Chuck, non è necessario avere un'interfaccia definita come tale. Puoi semplicemente eseguire ...direttamente nel metodo:

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

Quindi puoi chiamarlo:

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

O

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

0

Se l'argomento ... args [] non viene utilizzato Typescript crea ancora un array in Javascript e copia gli argomenti su di esso.

Per evitare questa inutilità puoi realizzare un prototipo sia per la funzione che per la funzione, così: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.