CodeForge

TypeScript de Cero a Experto / Por qué TS

Inferencia: deja que TypeScript adivine (bien)

Teoría20 min20 XP

El miedo del principiante en TypeScript: "¿tengo que escribir : tipo en cada línea?". No. TypeScript es sorprendentemente listo: en la mayoría de los casos DEDUCE el tipo solo. Anotar de más ensucia el código tanto como no anotar lo esencial. Hoy aprendes a distinguir dónde tu tipo hace falta y dónde estorba.

El asistente que ya lo sabe

TypeScript deduce lo local

Cuando un valor nace de algo que TS ya conoce, no anotes: lo infiere y con más precisión que tú:

inferencia.ts
const precio = 5000;              // TS infiere: number
const nombre = "Café";            // TS infiere: string
const activo = true;              // TS infiere: boolean
const gastos = [100, 200, 300];   // TS infiere: number[]

// el retorno también se infiere: TS sabe que esto devuelve number
function doble(n: number) {
return n * 2;                   // retorno inferido: number
}

// resultado de métodos conocidos: inferido
const mayusculas = nombre.toUpperCase();   // TS infiere: string
const total = gastos.reduce((s, g) => s + g, 0);  // TS infiere: number

Escribir : number en cada una de esas líneas no añade seguridad —TS ya lo sabe— y añade ruido. La regla mental: si el valor viene con su tipo puesto (un literal, el resultado de algo tipado), cállate y deja que infiera.

La regla de oro: anota los bordes

Nota cómo solo hay dos anotaciones (nombre: string, valores: number[]) —los bordes— y el resto fluye inferido. El código se lee limpio y TS te protege igual: si dentro sumaras un string, lo marcaría al instante.

const vs let: el tipo se ensancha

Un detalle sutil pero útil. TypeScript infiere tipos MÁS específicos para const que para let, porque un const no puede cambiar:

widening.ts
const categoria = "comida";   // tipo inferido: "comida" (¡el literal exacto!)
let estado = "activo";        // tipo inferido: string (puede reasignarse)

// 'categoria' es del tipo literal "comida", no solo string.
// 'estado' es string, porque let permite estado = "otra cosa" después.

// esto importa cuando quieres tipos literales exactos (lección de M02):
const metodo = "GET";         // "GET" — útil para uniones de literales

Como const categoria = "comida" nunca cambiará, TS lo infiere como el tipo literal "comida" (no el genérico string). Con let, como podrías reasignarlo, lo "ensancha" a string. Este comportamiento —widening— será clave cuando en el módulo 2 construyas uniones de literales como "comida" | "transporte" | "ocio".

¿Cuál de estas anotaciones SOBRA (es ruido redundante) según la regla de oro?

Mini-reto

Afina el ojo: 1) escribe una función estadisticas(numeros: number[]) que calcule suma, promedio y mayor, y devuelva un objeto con los tres; 2) anota SOLO el parámetro y deja que TS infiera todo lo interno y el retorno; 3) pasa el cursor (en tu editor o el Playground oficial) sobre cada const interno y confirma que TS ya dedujo number sin que lo escribieras. Interioriza cuánto sabe TS solo.

Qué sigue

Cierras el módulo con un reto que junta todo: montar la configuración estricta y tipar un módulo real de "Mi Bolsillo" —anotando los bordes, dejando inferir el resto, y sintiendo cómo strict te obliga a manejar los casos que en JavaScript ignorabas.