arguments de fonction ouverts avec TypeScript


128

IMO, l'une des principales préoccupations du langage TypeScript est de prendre en charge le code JavaScript vanilla existant. C'est l'impression que j'ai eue au premier coup d'œil. Jetez un œil à la fonction JavaScript suivante qui est parfaitement valide:

Remarque: 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 n'importe quel nombre d'arguments:

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

Cependant, lorsque j'essaye cela avec TypeScript Playground , cela donne des erreurs de compilation.

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


2
Juste curieux, pourquoi avez-vous même un numbersparamètre nommé ? Vous ne faites rien avec.
Justin Morgan

1
@JustinMorgan ayant au moins un paramètre permet à Intellisense au moins d'indiquer qu'il devrait y avoir des arguments.
drzaus

Réponses:


268

La méthode TypeScript pour ce faire est de placer l'opérateur points de suspension ( ...) avant le nom de l'argument. Ce qui précède serait écrit comme,

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

Cela tapera alors correctement vérifier avec

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

Génial! Merci. C'est certainement la voie à suivre. Donc, si quelqu'un a un code existant comme dans ma question, il se cassera. Droite?
tugberk

1
Oui. Il se plaint de l'appel mais vous pouvez déclarer sum comme acceptant plusieurs paramètres de n'importe quel type en changeant la signature en sum (...) à la place et cela atténuera l'erreur. N'hésitez pas à soumettre ceci comme un bogue sur CodePlex.
chuckj

1
Je cherchais un exemple de paramètre de repos. Ty.
AM

5

En plus de la réponse @chuckj: vous pouvez également utiliser un arrow function expressiondans TypeScript (c'est une sorte de lambdaJava / .NET)

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

4

Dans Typescript, c'est le concept de Rest Parameter , c'est le paramètre qui reçoit plusieurs valeurs de type similaire.Si nous ciblons le typographie, nous devons écrire le code standard ECMAScript 6 , puis le transpileur de typescript le convertit en son code de script java équivalent ( qui est la norme ECMAScript 5 ) .Si nous utilisons dactylographié, nous devons utiliser trois points (...) preferx avec le nom de la variable restparameter, comme la fonction sum (... numbers: number []), alors cela fonctionnerait.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.