argumentos de función abiertos con TypeScript

128

En mi opinión, una de las principales preocupaciones del lenguaje TypeScript es admitir el código JavaScript vainilla existente. Esta es la impresión que tuve a primera vista. Eche un vistazo a la siguiente función de JavaScript que es perfectamente válida:

Nota: No estoy diciendo que me guste este enfoque. Solo digo que este es un código JavaScript válido.

function sum(numbers) { 

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

    return agregatedNumber;
}

Entonces, consumimos esta función con cualquier número de argumentos:

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

Sin embargo, cuando pruebo esto con TypeScript Playground , da errores de tiempo de compilación.

Estoy asumiendo que esto es un error. Supongamos que no tenemos los problemas de compatibilidad. Entonces, ¿hay alguna forma de escribir este tipo de funciones con argumentos abiertos? Como la paramsfunción en C #?

tugberk
fuente
2
Por curiosidad, ¿por qué tienes un numbersparámetro con nombre ? No estás haciendo nada con eso.
Justin Morgan
1
@JustinMorgan que tiene al menos un parámetro le permite a Intellisense al menos insinuar que debería haber algunos argumentos.
drzaus

Respuestas:

268

La forma de hacer esto de TypeScript es colocar el operador de puntos suspensivos ( ...) antes del nombre del argumento. Lo anterior se escribiría como,

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

Esto tecleará check correctamente con

console.log(sum(1, 5, 10, 15, 20));
chuckj
fuente
¡Excelente! Gracias. Este es definitivamente el camino a seguir. Entonces, si alguien tiene un código existente como en mi pregunta, se romperá. ¿Correcto?
tugberk
1
Si. Se queja de la llamada, pero puede declarar la suma como aceptando múltiples parámetros de cualquier tipo cambiando la firma a suma (...) en su lugar, y silenciará el error. No dude en enviar esto como un error en CodePlex.
chuckj
1
Estaba buscando un ejemplo de parámetro de descanso. Ty
AM
5

Además de la respuesta @chuckj: También puede usar un arrow function expressionen TypeScript (es una especie de lambdaen Java / .NET)

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}
Jeroen van Dijk-Jun
fuente
4

En Typecript es el concepto de parámetro de reposo , es el parámetro que recibe múltiples valores de tipo similar. Si apuntamos al typecript, entonces tenemos que escribir el código ECMAScript 6 estándar, luego el transpiler typecript lo convierte a su código de script java equivalente ( que es el estándar ECMAScript 5 ). Si usamos typecript, entonces tenemos que usar tres puntos (...) preferx con el nombre de la variable del parámetro rest, como la función sum (... números: número []), entonces funcionaría.

Nota: El parámetro de reposo debe ser el último parámetro en la lista de parámetros. Asimismo, la función sum (nombre: cadena, edad: número, ... números: número []).

Sheo Dayal Singh
fuente