2012-10-02 55 views
75

IMO, una de las principales preocupaciones del lenguaje TypeScript es admitir el código JavaScript 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:argumentos de función abierta con TypeScript

Nota: No estoy diciendo que me gusta 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; 
} 

Así que consumen esta función con cualquier número de argumentos:

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

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

Supongo que esto es un error. Supongamos que no tenemos problemas de compatibilidad. Entonces, ¿hay alguna forma de escribir este tipo de funciones con argumentos abiertos? Tal como params función en C#?

+0

Solo curiosidad, ¿por qué incluso tienes un parámetro llamado 'numbers'? No estás haciendo nada con eso. –

+0

@JustinMorgan que tiene al menos un parámetro permite que Intellisense al menos sugiera que debe haber algunos argumentos. – drzaus

Respuesta

183

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

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

Esto continuación, escriba comprobar correctamente con

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

¡Genial! Gracias. Este es definitivamente el camino a seguir. Entonces, si alguien tiene un código existente como en mi pregunta, se romperá. ¿Derecha? – tugberk

+1

Sí. Se queja de la llamada, pero puede declarar que la suma acepta múltiples parámetros de cualquier tipo cambiando la firma a suma (...) en su lugar, silenciará el error. Por favor, siéntase libre de enviar esto como un error en CodePlex. – chuckj

+1

Estaba buscando un ejemplo de parámetro de descanso. Ty. –

2

Además de @chuckj respuesta: También puede utilizar una expresión lambda a máquina de escribir

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