signatures de type dactylographiée pour les fonctions ayant un nombre variable d'arguments

voix
61

Je vais avoir du mal à définir les interfaces avec les membres de la fonction qui acceptent des quantités variables d'arguments. Prenez l'objet suivant littéral comme exemple:

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

Je voudrais être en mesure de définir une interface telle que:

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

Pour que le code suivant peut compiler sans erreur:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
Créé 05/10/2012 à 04:40
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
106

Tapuscrit utilise la ECMAScript 6 proposition de diffusion,

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

mais ajoute des annotations de type donc cela ressemblerait,

interface IExample {
    func(...args: any[]): void;
}
Créé 05/10/2012 à 04:53
source utilisateur

voix
2

Il suffit d'ajouter à la réponse de mandrin, vous n'avez pas besoin d'avoir une interface définie en tant que telle. Vous pouvez juste faire le ...directement dans la méthode:

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

Ensuite, vous pouvez l'appeler:

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

Ou

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
Créé 04/02/2018 à 12:49
source utilisateur

voix
0

Si le ... args [] argument n'est pas utilisé Tapuscrit crée encore un tableau dans le Javascript et copie les arguments à lui.

Pour éviter cela, vous pouvez faire un inutilité prototype de la fonction, ainsi que la fonction, ainsi: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Créé 21/05/2018 à 14:34
source utilisateur

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