semnături de tip typescript pentru funcții cu un număr variabil de argument

voturi
61

Am probleme cu definirea interfețelor cu membrii funcții care acceptă cantități variabile de argumente. Ia următorul obiect literal ca un exemplu:

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

Aș vrea să fie în măsură să definească o interfață, cum ar fi:

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

Așa că următorul cod poate compila fără eroare:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
Întrebat 05/10/2012 la 04:40
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
106

Typescript folosește propunerea răspândirea ECMAScript 6,

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

dar adaugă adnotări de tip astfel încât acest lucru ar arata ca,

interface IExample {
    func(...args: any[]): void;
}
Publicat 05/10/2012 la 04:53
sursa de către utilizator

voturi
2

Doar pentru a adăuga la răspunsul lui Chuck, nu trebuie să aibă o interfață definită ca atare. Puteți face o doar ...direct în metoda:

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

Apoi, puteți numi:

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

Sau

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
Publicat 04/02/2018 la 12:49
sursa de către utilizator

voturi
0

În cazul în care ... args [] argumentul nu este folosit încă typescript creează o matrice în Javascript și copiază argumentele la ea.

Pentru a evita acest lucru unnecessariness puteți face un prototip pentru funcția cât și funcția, astfel: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Publicat 21/05/2018 la 14:34
sursa de către utilizator

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