Tipo dattiloscritto firme per le funzioni con conteggi di argomenti variabili

voti
61

Ho problemi a definire interfacce con i membri di funzioni che accettano quantità variabili di argomenti. Prendiamo il seguente letterale oggetto come un 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 ad esempio:

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

In modo che il seguente codice può compilare senza errori:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
È pubblicato 05/10/2012 alle 04:40
fonte dall'utente
In altre lingue...                            


3 risposte

voti
106

Dattiloscritto utilizza la proposta diffusione ECMAScript 6,

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

ma aggiunge le annotazioni di tipo quindi questo sarebbe simile,

interface IExample {
    func(...args: any[]): void;
}
Risposto il 05/10/2012 a 04:53
fonte dall'utente

voti
2

Giusto per aggiungere alla risposta di Chuck, non c'è bisogno di avere un'interfaccia definita come tale. Si può solo fare lo ...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;
}

Poi si può chiamare:

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"))
Risposto il 04/02/2018 a 12:49
fonte dall'utente

voti
0

Se il ... args argomento [] non viene usato tipografico crea ancora una matrice in Javascript e copia gli argomenti ad esso.

Per evitare questo unnecessariness si può fare un prototipo per la funzione così come la funzione, in tal modo: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Risposto il 21/05/2018 a 14:34
fonte dall'utente

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