
¿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
- Código secuencial: Aunque los efectos pueden ser asíncronos, el código se lee de arriba a abajo
- Manejo de errores automático: Si un efecto falla, el generador se detiene y propaga el error
- Tipado completo: TypeScript infiere los tipos correctamente en cada paso
- 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
| Aspecto | JavaScript Nativo | Effect |
|---|---|---|
| Propósito de yield* | Delegar a otro iterable | Ejecutar un efecto |
| Valores producidos | Múltiples | Uno (el resultado) |
| Uso principal | Composición de iterables | Composición de efectos |
| Manejo de errores | Manual | Automá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*sobrepipe+flatMappara 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.*

Remix + React + Recaptcha ⚡️
Checa este otro Post

