Las funciones son piezas fundamentales en la programación, ya que nos permiten dividir programas complejos en bloques pequeños y manejables que realizan tareas específicas. En TypeScript, trabajar con funciones no solo implica escribir el código que realiza una tarea, sino también aprovechar el sistema de tipos para hacer nuestro código más seguro y fácil de mantener.
Cuando declaramos una función, como por ejemplo una que sume dos números, lo hacemos usando la palabra clave function seguida del nombre de la función y los argumentos entre paréntesis. Estos argumentos son variables que la función recibe desde el exterior y con las que trabaja internamente. Por ejemplo, si queremos sumar dos números, podemos llamar a los argumentos m y n. Dentro del cuerpo de la función, podemos realizar la operación y devolver el resultado con la palabra clave return.
function sumar(m, n) {
const suma = m + n;
console.log(`${m} + ${n} = ${suma}`);
return suma;
}
Este código funciona perfectamente en JavaScript y también en TypeScript si no especificamos tipos, pero aquí es donde empiezan los problemas. Al no tipar los argumentos, podemos pasar valores inesperados, como booleanos o cadenas, y la función seguirá ejecutándose sin errores, aunque el resultado no tenga sentido. Por ejemplo, sumar false y true devuelve 1, y sumar "false" y "true" devuelve la concatenación "falsetrue". Esto puede llevar a errores difíciles de detectar, especialmente si no contamos con pruebas automatizadas que los detecten.
Para evitar estos problemas, TypeScript nos permite especificar el tipo de cada argumento, limitando así los valores que la función puede recibir. Para ello, añadimos dos puntos y el tipo después del nombre de cada argumento. En nuestro ejemplo, si queremos que m y n sean números, lo declaramos así:
function sumar(m: number, n: number) {
const suma = m + n;
console.log(`${m} + ${n} = ${suma}`);
return suma;
}
Con esta declaración, el compilador nos avisará si intentamos pasar valores que no sean números, como false o "true". Aunque el código JavaScript se genere igual, ahora tenemos una capa de seguridad que nos ayuda a detectar errores antes de ejecutar el programa.
Además, TypeScript puede inferir el tipo de retorno de la función basándose en el valor que devolvemos. En este caso, como suma es un número, el compilador entiende que sumar devuelve un number. Sin embargo, también podemos especificar explícitamente el tipo de retorno después de los paréntesis de los argumentos, usando dos puntos y el tipo:
function sumar(m: number, n: number): number {
const suma = m + n;
console.log(`${m} + ${n} = ${suma}`);
return suma;
}
Esto nos permite asegurarnos de que la función siempre devolverá un valor del tipo esperado, y si por error devolvemos otro tipo, TypeScript nos lo indicará.
Trabajar con funciones tipadas en TypeScript nos ayuda a construir programas más robustos y fáciles de mantener, ya que podemos detectar errores de tipo en tiempo de compilación y evitar comportamientos inesperados en tiempo de ejecución. Además, al dividir nuestro código en funciones pequeñas que hacen una única cosa bien, podemos construir programas complejos de forma ordenada y modular.
Las funciones en TypeScript son estructuras de primera clase, lo que significa que tienen muchas características avanzadas que podemos explorar para escribir código aún más eficiente y reutilizable. Pero para empezar, entender cómo declararlas y tiparlas correctamente es fundamental para aprovechar todo el potencial de TypeScript en nuestros proyectos.