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

Modelo de caja explicado sencillamente

Checa este otro Post

meta cover

Cómo crear un recortador de imagen de perfil con Fabric.js

Checa este otro Post

¡Nuevo curso!

Animaciones web con React + Motion 🧙🏻