MÓDULO 1: TYPESCRIPT

Tipos Personalizados

Los **tipos personalizados** (Type Aliases) nos permiten crear nuestros propios tipos complejos combinando primitivos, uniones, intersecciones y más. Son la herramienta definitiva para modelar datos específicos de nuestro juego.


1. Type Alias Básicos

Renombramos tipos existentes para mayor claridad.

type VidaMaxima = number;
type NombrePersonaje = string;
type Coordenada2D = [number, number];

const saludHeroe: VidaMaxima = 500;
const posEnemigo: Coordenada2D = [100, 200];

2. Uniones de Tipos (Union Types)

Un valor puede ser uno de varios tipos posibles.

type RarezaItem = "Común" | "Rara" | "Épica" | "Legendaria";
type TipoArma = "Espada" | "Arco" | "Bastón";

type ItemBasico = {
    nombre: string;
    rareza: RarezaItem;
    tipo?: TipoArma;
};

const espadaLegendaria: ItemBasico = {
    nombre: "Excalibur",
    rareza: "Legendaria",
    tipo: "Espada"
};

⚠️ TypeScript solo acepta valores de la unión: "Común", "Rara", "Épica", "Legendaria".


3. Intersección de Tipos (Intersection Types)

Combinamos múltiples tipos en uno solo.

type EstadisticasBase = {
    vida: number;
    ataque: number;
    defensa: number;
};

type Identidad = {
    nombre: string;
    id: number;
};

type PersonajeCompleto = EstadisticasBase & Identidad & {
    clase: string;
};

const arqueroElite: PersonajeCompleto = {
    nombre: "Sylvana",
    id: 42,
    clase: "Arquero",
    vida: 250,
    ataque: 85,
    defensa: 35
};

4. Tipos Condicionales

Tipos que dependen de otras propiedades.

type ItemConMana<T extends string> = T extends "Mago" ? 
    { nombre: string; manaCosto: number } : 
    { nombre: string; danoFisico: number };

// Para mago
const bolaFuego: ItemConMana<"Mago"> = {
    nombre: "Bola de Fuego",
    manaCosto: 25
};

// Para guerrero
const hachazo: ItemConMana<"Guerrero"> = {
    nombre: "Hachazo Brutal",
    danoFisico: 120
};

5. Mapped Types (Transformación)

type StatsBase = {
    vida: number;
    ataque: number;
    mana: number;
};

// Hace todas las propiedades opcionales
type StatsParciales = {
    [K in keyof StatsBase]?: StatsBase[K];
};

const statsIniciales: StatsParciales = {
    vida: 100
    // ataque y mana son opcionales
};

6. Type vs Interface: Cuándo Usar Cada Uno

🟦 INTERFACE: Objetos, herencia, APIs externas.
🟣 TYPE: Uniones, intersecciones, tipos primitivos, condicionales.

🛠️ Tu Misión

Prueba esto en TypeScript Playground:

  1. Crea un type EstadoCombate con unión: "peleando" | "explorando" | "muerto".
  2. Define type StatsHeroe como intersección de vida, ataque y nombre.
  3. Crea type Inventario como array de objetos con nombre y rareza (union type).
  4. Bonus: Type condicional para items de mago vs guerrero.
← Lección Anterior