Ejemplo (1): creando una API REST simple en TypeScript

Empezamos un caso de uso práctico en el que voy a mostrar cómo es la creación de una pequeña API REST con Express que pueda responder a consultas rápidas hechas a su endpoint. En este primer capítulo, creo un proyecto configurándolo correctamente: su package.json, su tsconfig.json, instalamos TypeScript, rimraf, montamos scripts... y le damos salida.

Empezamos creando una API REST sencilla en TypeScript desde cero, partiendo de un repositorio completamente vacío. La idea es construir un proyecto básico que nos permita entender todo el flujo, desde la inicialización con npm init hasta tener un producto funcional que responda con datos JSON. No se trata de un proyecto complejo ni de una aplicación con muchas funcionalidades, sino de un ejemplo práctico para ver cómo se integra TypeScript en un entorno real con Express.

Para este ejemplo, hemos decidido trabajar con datos reales de fútbol que se obtienen de OpenFootball, un repositorio en GitHub que publica información sobre ligas europeas. En concreto, descargamos dos archivos JSON: uno con los clubes participantes en la liga española y otro con los resultados de los partidos. Estos datos nos servirán para crear una API que, al recibir una petición con el nombre corto de un equipo, nos devuelva información sobre sus partidos y resultados.

El primer paso fue crear la estructura del proyecto. Creamos un directorio para el repositorio, inicializamos el proyecto con npm init y configuramos el archivo package.json. Decidimos organizar el código fuente en una carpeta src y compilarlo a una carpeta dist, siguiendo buenas prácticas para proyectos TypeScript. Instalamos TypeScript como dependencia de desarrollo con npm install --save-dev typescript para poder transpilar nuestro código.

Luego, configuramos el archivo tsconfig.json con las opciones básicas: establecimos rootDir en src y outDir en dist, y mantuvimos el modo estricto activado para asegurar un chequeo de tipos riguroso. También añadimos scripts en package.json para compilar (npm run build), ejecutar (npm run start) y limpiar la carpeta de salida (npm run clean).

Para importar los archivos JSON dentro del proyecto, usamos la función require, que permite cargar directamente archivos JSON en Node.js. Como TypeScript no reconoce require por defecto, instalamos los tipos de Node para que el compilador entienda esta función. Así, podemos trabajar con los datos de los clubes y resultados sin problemas.

Para mantener el proyecto limpio, instalamos la dependencia rimraf, que es una herramienta multiplataforma para eliminar carpetas y archivos, similar a rm -rf en Unix, pero compatible con Windows. Esto nos permite definir un script clean que borre la carpeta dist sin preocuparnos por el sistema operativo.

Finalmente, configuramos un repositorio Git local para controlar las versiones del proyecto. Añadimos un .gitignore para evitar subir la carpeta node_modules, y realizamos los primeros commits para guardar el progreso. Este repositorio es solo para uso personal y no se subirá a ningún servidor remoto.

Con esta base lista, tenemos un proyecto TypeScript configurado, con datos JSON reales integrados y preparado para empezar a construir la API REST que responderá con información sobre los partidos de fútbol. En los siguientes pasos, nos centraremos en tipar correctamente los datos, crear las rutas en Express y devolver respuestas JSON basadas en las peticiones que recibamos.

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