web-dev-qa-db-fra.com

arguments de fonction ouverte avec TypeScript

IMO, l’une des préoccupations principales du langage TypeScript est de prendre en charge le code JavaScript Vanilla existant. C'est l'impression que j'ai eu au premier regard. Jetez un oeil à la fonction JavaScript suivante qui est parfaitement valide:

Note: Je ne dis pas que j'aime cette approche. Je dis simplement que c'est un code JavaScript valide.

function sum(numbers) { 

    var agregatedNumber = 0; 
    for(var i = 0; i < arguments.length; i++) { 
        agregatedNumber += arguments[i];
    }

    return agregatedNumber;
}

Donc, nous consommons cette fonction avec un nombre quelconque d’arguments:

console.log(sum(1, 5, 10, 15, 20));

Cependant, lorsque j'essaie ceci avec TypeScript Playground , cela génère des erreurs de compilation.

Je suppose que c'est un bug. Supposons que nous n’ayons pas de problèmes de compatibilité. Alors, y a-t-il un moyen d'écrire ce type de fonctions avec des arguments ouverts? Tels que params feature en C #?

104
tugberk

La méthode TypeScript consiste à placer l’opérateur Ellipsis (...) avant le nom de l'argument. Ce qui précède serait écrit comme suit:

function sum(...numbers: number[]) {
    var aggregateNumber = 0;
    for (var i = 0; i < numbers.length; i++)
        aggregateNumber += numbers[i];
    return aggregateNumber;
}

Ce sera ensuite tapez vérifier correctement avec

console.log(sum(1, 5, 10, 15, 20));
240
chuckj

En plus de @chuckj answer: Vous pouvez également utiliser un arrow function expression in TypeScript (est une sorte de lambda in Java/.NET)

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}
4

Dans TypeScript, le concept Rest Parameter, est le paramètre qui reçoit plusieurs valeurs de type similaire. Si nous ciblons le TypeScript, nous devons écrire le code ECMAScript 6 standard, alors le transpiler TypeScript le convertit en son équivalent Java de script (qui est ECMAScript 5 standard)). Si nous utilisons TypeScript, nous devons utiliser trois points (. ..) preferx avec le nom de variable restparameter, tel que la fonction sum (... numbers: number []), alors cela fonctionnerait.

Remarque: Reste Le paramètre doit être le dernier paramètre de la liste des paramètres. Il en est de même de la fonction sum (nom: chaîne, âge: nombre, ... nombres: nombre []).

3
Sheo Dayal Singh