Saltar al contenido principal
Volver atrás

TypeScript #2: Tipos Literales y Uniones

#typescript #union-types #literals

Cómo decirle a TypeScript que algo solo puede ser "A" o "B" y nada más. Adiós a los strings mágicos.

En la Parte 1 vimos que const crea tipos literales. Si escribimos const rol = "admin", para TypeScript rol no es un simple string, sino que es específicamente "admin".

Hoy vamos a ver cómo usar eso para crear código a prueba de balas.

String vs. String Literal

Imaginemos que tenemos una función para pintar un botón.

typescript
function pintarBoton(color: string) {
  if (color === 'tojo') { // ❌ Ups, error de dedo ("tojo" en vez de "rojo")
      return '🔴';
  }
  return '🔵';
}

pintarBoton("azul"); // ✅ Bien
pintarBoton("patata 🥔"); // ✅ Bien (pero no debería, ¡patata no es un color!)

El problema aquí es que string es demasiado amplio. Admite “azul”, “rojo”, y también “patata 🥔” o “asdfg”.

La Unión de Tipos

Aquí es donde entra el operador | (pipe). Se lee como “O”. Podemos decirle a TypeScript: “El color solo puede ser ‘rojo’ O ‘azul’ O ‘verde’”.

typescript
type ColorBoton = "rojo" | "azul" | "verde";

function pintarBoton(color: ColorBoton) {
  // ...
}

pintarBoton("rojo");   // ✅ Perfecto
pintarBoton("verde");  // ✅ Perfecto
pintarBoton("patata 🥔");
// ❌ Error: Argument of type '"patata 🥔"' is not assignable to parameter of type 'ColorBoton'.

¡Bum! 💥 Acabamos de eliminar una categoría entera de bugs. Ya nadie puede pasar una cadena incorrecta a nuestra función.

El Autocompletado (IntelliSense)

Lo mejor de esto no es solo la seguridad, es la experiencia de desarrollo.

Vamos a probarlo: Entre las comillas, pulsamos Ctrl + Espacio en cada una. En la primera no hay sugerencias (es un string genérico). En la segunda el editor te sugiere las opciones válidas.

No tenemos que ir a la documentación para saber qué valores aceptaba. El propio tipo nos dice qué valores acepta.

Uniones Mixtas

Podemos mezclar tipos si queremos (aunque usémoslo con cabeza):

typescript
// Un ID puede ser un número (ID de base de datos) o un string (UUID)
type ID = number | string;

function buscarUsuario(id: ID) {
  console.log("Buscando usuario con ID:", id);
}

buscarUsuario(123); // ✅
buscarUsuario("abc-123"); // ✅

Resumen

  • Tipos Literales: Valores exactos ("rojo", 1).
  • Uniones (|): Combinar tipos (A | B significa A o B).
  • Usémoslo para evitar “Magic Strings” y ganar autocompletado gratis.

En la próxima parte veremos cómo Tipar Objetos e Interfaces para dejar de pasar objetos anónimos sin control por nuestra aplicación.