cover

Entendiendo yield*: El Operador de Delegación en JavaScript y Effect


¿Alguna vez te has preguntado qué hace ese asterisco misterioso después de yield? Hoy vamos a desmenuzar yield*, un operador que puede simplificar drásticamente tu código cuando trabajas con generadores en JavaScript y, especialmente, cuando usas Effect en TypeScript.

Parte 1: yield* en JavaScript Nativo

¿Qué es un Generador?

Antes de entender yield*, necesitamos tener claro qué es un generador. Un generador es una función especial que puede pausar su ejecución y reanudarla después.

Cada vez que llamamos .next(), la función se ejecuta hasta el siguiente yield y pausa ahí.

La Magia de yield*

Ahora, ¿qué pasa cuando queremos componer generadores? Es decir, cuando un generador quiere "delegar" a otro generador. Ahí es donde entra yield*.

Sin yield*, tendríamos que iterar manualmente:

El asterisco en yield* significa: "itera sobre este iterable y produce cada valor uno por uno".

Caso Práctico: Recorriendo un Árbol

Un uso clásico de yield* es recorrer estructuras recursivas:

Parte 2: yield* en Effect (TypeScript)

El Mundo de Effect

Effect es una librería de TypeScript que lleva la programación funcional a otro nivel. Usa generadores de una manera muy elegante para manejar operaciones asíncronas, errores y efectos secundarios.

En Effect, yield* tiene un papel fundamental: ejecutar efectos y obtener sus resultados.

La Diferencia Crucial

En JavaScript nativo, yield* delega a otro iterable (produce múltiples valores).

En Effect, yield* ejecuta un efecto y extrae su valor (produce un solo valor).

Ejemplo Práctico con Effect

Veamos un caso más realista: un flujo de autenticación:

Beneficios Clave de yield* en Effect

  1. Código secuencial: Aunque los efectos pueden ser asíncronos, el código se lee de arriba a abajo
  2. Manejo de errores automático: Si un efecto falla, el generador se detiene y propaga el error
  3. Tipado completo: TypeScript infiere los tipos correctamente en cada paso
  4. Composición natural: Puedes combinar efectos como si fueran simples llamadas a funciones

Comparación Visual

Sin yield (código anidado):*

Con yield (código secuencial):*

Comparativa Rápida

AspectoJavaScript NativoEffect
Propósito de yield*Delegar a otro iterableEjecutar un efecto
Valores producidosMúltiplesUno (el resultado)
Uso principalComposición de iterablesComposición de efectos
Manejo de erroresManualAutomático

Mejores Prácticas

En JavaScript nativo:

  • Usa yield* para componer generadores relacionados
  • Útil para recorrido de estructuras recursivas
  • Evita anidación excesiva de loops

En Effect:

  • Prefiere Effect.gen + yield* sobre pipe + flatMap para flujos complejos
  • Cada yield* es un "punto de await" para efectos
  • El código se lee como si fuera síncrono, pero maneja async, errores y más

¿Quieres aprender más?

Si te interesa dominar Effect y llevar tu TypeScript al siguiente nivel, únete a nuestra lista de correo donde compartimos tutoriales avanzados cada semana.*

meta cover

Remix + React + Recaptcha ⚡️

Checa este otro Post

meta cover

Cómo publicar tu sitio Remix, en Cloudflare

Checa este otro Post

¡Nuevo curso!

Animaciones web con React + Motion 🧙🏻