Fichier de déclaration TypeScript pour la fonction avec un nombre variable/type d'arguments

headjs fait des choses de type JavaScript très folles sur son API. Par exemple, il faut un nombre arbitraire de chaînes (pas un tableau de chaînes) pour une fonction. Parfois, il termine ce même appel de fonction, vous pouvez éventuellement le terminer avec une fonction, par exemple.

head.js("scripturl1", "scripturl2",...,callback);

Vous pouvez également (tout aussi facilement) faire ce qui suit

head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback);

Ma question est comment diable décrivons-nous cela dans un fichier de déclaration ? Je suis tout ouïe ici car mon laissez-passer actuel semble complètement erroné.

Répondre

La spécification du langage TS fait référence aux paramètres de nombre/diffusion variables en tant que « paramètres de repos ». Un exemple d'interface avec une signature de fonction qui accepte les paramètres de repos :

interface IExample {
    fn : (...args : any[]) => any;
}

var x : IExample = {
    fn: function(...args : any[]) {
        for (var i = 0, arg; arg = args[i]; i++) {
            console.log(arg);
        }
    }
}

x.fn(1);
x.fn(1, 2);
x.fn("cat", "dog", "mouse");

Malheureusement, il existe certaines limitations. Le "paramètre de repos" doit être le dernier dans la signature d'une fonction - vous ne pourrez donc pas capturer le type du paramètre de rappel car il se trouve après le paramètre de répétition.

Si ce n'était pas le cas, vous auriez pu faire quelque chose comme ceci :

var fn = function(cb: Function, ...args : string[]) {
    ...
}