Funciones: lo básico

Las funciones de TypeScript son como las funciones de JavaScript. En este capítulo escribo funciones en TypeScript y presento las ventajas de tipar adecuadamente sus entradas y sus salidas para prevenir errores cuando las invoquemos.

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.

Lista de reproducción
  1. 1
    Temporada 1
    5 minutos
  2. 2
    ¿Qué es TypeScript?
    11 minutos
  3. 3
    Instalando TypeScript
    8 minutos
  4. 4
    Compilando un Hola Mundo sencillo
    7 minutos
  5. 5
    Hola Mundo pero con tipos
    10 minutos
  6. 6
    Tipos: tipos primitivos
    12 minutos
  7. 7
    Tipos: tipos especiales (any, null, ...)
    10 minutos
  8. 8
    Tipos: arrays y tuplas
    11 minutos
  9. 9
    Tipos: objetos
    7 minutos
  10. 10
    Funciones: lo básico
    9 minutos
  11. 11
    Funciones: tipando funciones
    9 minutos
  12. 12
    Clases: introducción a las clases
    9 minutos
  13. 13
    Clases: creando una clase
    10 minutos
  14. 14
    Clases: modificador private
    8 minutos
  15. 15
    Clases: modificador readonly
    3 minutos
  16. 16
    Clases: Atributos virtuales con getters y setters
    10 minutos
  17. 17
    Clases: herencia
    9 minutos
  18. 18
    Clases: modificadores abstract y protected
    8 minutos
  19. 19
    Tipos alias
    6 minutos
  20. 20
    Tipos literales
    5 minutos
  21. 21
    Uniones de tipos
    7 minutos
  22. 22
    Uniones discriminantes
    7 minutos
  23. 23
    Intersecciones de tipos
    5 minutos
  24. 24
    Interfaces: introducción
    7 minutos
  25. 25
    Interfaces: modificadores y funciones
    9 minutos
  26. 26
    Interfaces: usándolas con clases
    8 minutos
  27. 27
    Interfaces: herencia de interfaces
    8 minutos
  28. 28
    Interfaces: interfaces indizadas
    5 minutos
  29. 29
    Interfaces: funciones y tipos híbridos
    5 minutos
  30. 30
    ¿Qué diferencia hay entre interfaces y tipos? (2020)
    8 minutos
  31. 31
    Casteos con as
    6 minutos
  32. 32
    instanceof y las guardas
    9 minutos
  33. 33
    Tipos enumerados
    8 minutos
  34. 34
    Valores avanzados para enumerados
    7 minutos
  35. 35
    Enumerados con valores computados
    6 minutos
  36. 36
    Genéricos en tipos
    8 minutos
  37. 37
    Múltiples genéricos y buenas prácticas
    5 minutos
  38. 38
    Genéricos en funciones
    8 minutos
  39. 39
    Genéricos con restricciones
    6 minutos
  40. 40
    Tipos de utilidad
    3 minutos
  41. 41
    Exportando módulos
    9 minutos
  42. 42
    Importando módulos
    7 minutos
  43. 43
    Export default e import asterisco
    6 minutos
  44. 44
    tsconfig
    7 minutos
  45. 45
    Módulos desde NPM
    7 minutos
  46. 46
    Arroba types y los .d.ts
    8 minutos
  47. 47
    Ejemplo (1): creando una API REST simple en TypeScript
    11 minutos
  48. 48
    Ejemplo (2): montando un servidor Express
    8 minutos
  49. 49
    Ejemplo (3): haciendo las funciones de control de datos
    11 minutos
  50. 50
    Ejemplo (4): conectando todas las piezas
    7 minutos