M02L08Semana 2~2.5 h
L08 — Union types y narrowing
~2.5 h · Semana 2
Cierras la semana 2 con uniones discriminadas, typeof/in y un patrón Result para errores sin excepciones everywhere.
Objetivo
Parsear entrada de usuario o JSON parcial con ramas que TypeScript entiende después de cada guardia.
Por qué importa
La CLI recibirá strings sucios. Narrowing es cómo conviertes “string cualquiera” en datos válidos o error legible.
Pasos
1. Tipo Result (45 min)
src/tipos/resultado.ts:
export type Result<T, E = string> =
| { ok: true; value: T }
| { ok: false; error: E };
export function ok<T>(value: T): Result<T, never> {
return { ok: true, value };
}
export function err<E>(error: E): Result<never, E> {
return { ok: false, error };
}
2. Parse de entero positivo (40 min)
src/tipos/parse.ts:
import { err, ok, type Result } from "./resultado.js";
export function parseEnteroPositivo(raw: string): Result<number, string> {
const t = raw.trim();
if (!/^\d+$/.test(t)) return err("no es un entero positivo");
const n = Number(t);
if (n === 0) return err("debe ser mayor que cero");
return ok(n);
}
Usa if (!result.ok) { ... } y observa cómo TS acota value.
3. Handbook Narrowing (40 min)
Lee Narrowing y replica 2 ejemplos del handbook en src/tipos/ejemplos-narrowing.ts.
4. Katas + P1 progreso (25 min)
Llega a ≥15 katas o deja lista en README cuántas faltan para 20 (P1).
Lectura de esta lección
| Fuente | Qué leer |
|---|---|
| TS Handbook | Narrowing |
| Eloquent JavaScript | Repaso caps. 4–5 (ejercicio pendiente) |
| Catálogo | Bibliografía · M02 |
Hecho cuando
ResultyparseEnteroPositivocompilan; ramasok/errusadas correctamente.- Bitácora semana 2 M02 con horas y bloqueos.
- ≥15 katas o plan explícito para llegar a 20.
Errores comunes
- Union sin campo discriminante y lógica frágil.
- Cast con
aspara callar al compilador en vez de narrow. - Ignorar el branch
ok: false.