TypeScript Academy · Lección

Refinamiento de uniones entre límites de funciones

Mantenga una reducción segura entre límites de funciones mediante uniones discriminadas, retornos predicado y tipos al estilo Result.

Lección 3 de 38 pasos

Refinamiento de uniones entre límites de funciones es una lección gratuita de TypeScript Academy en CoddyKit. Esta es la lección 3 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de TypeScript Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de TypeScript Academy incluye 3 lecciones en total.

Introducción

Objetivo: Mantenga intacto el estrechamiento entre llamadas a funciones mediante uniones etiquetadas, retornos de predicados y ayudantes de validación.

  • Cero as inseguros en los puntos de llamada
  • Las mejoras de tipo viajan con los datos

Retorno de unión etiquetada

Patrón Result: quien llama estrecha el tipo comprobando ok. No hay conversiones de tipo y el flujo de control es claro.

type Ok<T> = { ok: true; value: T }
type Err = { ok: false; error: string }

type Result<T> = Ok<T> | Err

function parseIntSafe(s: string): Result<number> {
  const n = Number(s)
  return Number.isFinite(n) ? { ok: true, value: n } : { ok: false, error: "NaN" }
}

function useIt(s: string) {
  const r = parseIntSafe(s)
  if (r.ok) {
    // r is Ok<number>
    return r.value * 2
  }
  // r is Err
  return `bad: ${r.error}`
}

Retorno de predicado

Los retornos de predicados (x is T) centralizan las comprobaciones y mantienen el estrechamiento en los puntos de llamada.

type User = { id: number; name: string }

type MaybeUser = User | null

function hasUser(x: MaybeUser): x is User {
  return x !== null
}

function greet(x: MaybeUser) {
  if (hasUser(x)) {
    // x narrowed to User
    return `Hello ${x.name}`
  }
  return "Anonymous"
}

Propagar el estrechamiento

Estreche el tipo con una guarda (por ejemplo, isCircle) y después pase el valor; las funciones posteriores verán el tipo más específico.

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; size: number }

function isCircle(s: Shape): s is Extract<Shape, { kind: "circle" }> {
  return s.kind === "circle"
}

function area(s: Shape) {
  if (isCircle(s)) {
    // s is circle here
    return Math.PI * s.radius * s.radius
  }
  return s.size * s.size
}

Validar en el límite

Valide en el límite y devuelva Valid/Invalid; quienes llaman estrechan el tipo mediante la etiqueta y obtienen datos completamente tipados.

type Payload = { email: string; retries?: number }

type Valid = { ok: true; data: Required<Payload> }
type Invalid = { ok: false; issues: string[] }

type Validation = Valid | Invalid

function validate(p: unknown): Validation {
  const issues: string[] = []
  if (typeof p !== "object" || p === null) return { ok: false, issues: ["not an object"] }
  const x = p as any
  if (typeof x.email !== "string") issues.push("email:string")
  if (x.retries !== undefined && typeof x.retries !== "number") issues.push("retries:number")
  if (issues.length) return { ok: false, issues }
  return { ok: true, data: { email: x.email, retries: x.retries ?? 0 } }
}

function handle(p: unknown) {
  const v = validate(p)
  if (!v.ok) return `bad: ${v.issues.join(",")}`
  // v.data is fully typed here
  return `send to ${v.data.email} (${v.data.retries})`
}

Consejos

Prácticas recomendadas:

  • Prefiera etiquetas pequeñas y estables (ok, kind)
  • Centralice las comprobaciones en ayudantes de predicados
  • Utilice switches exhaustivos en los puntos de llamada
  • Evite any y las conversiones de tipo inseguras

Estrechamiento entre límites

Comprobación rápida: ¿Qué patrón conserva mejor el estrechamiento entre los límites de las funciones?

Repaso

Repaso: Transporte las mejoras de tipo como datos (Result), valide en los límites y evite las conversiones inseguras; quienes llaman estrechan el tipo mediante comprobaciones sencillas de etiquetas.

Gratis para empezar

Aprende TypeScript con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
101
Lecciones
352

Preguntas frecuentes

¿La lección «Refinamiento de uniones entre límites de funciones» es gratis?

Sí — el texto completo de «Refinamiento de uniones entre límites de funciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de TypeScript Academy, actualiza a CoddyKit PRO. El curso de TypeScript Academy incluye 3 lecciones en total.

¿Qué aprenderé en «Refinamiento de uniones entre límites de funciones»?

Mantenga una reducción segura entre límites de funciones mediante uniones discriminadas, retornos predicado y tipos al estilo Result. Practicas TypeScript Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar TypeScript Academy?

No se requiere experiencia previa. TypeScript Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 3.

¿Cuánto tiempo toma la lección «Refinamiento de uniones entre límites de funciones»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de TypeScript Academy?

Sí. Cada lección de TypeScript Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Switches exhaustivos y comprobaciones con never
  2. Funciones predicado y operador satisfies
  3. Refinamiento de uniones entre límites de funciones
← Volver a TypeScript Academy