<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Observables · DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/tags/observables/</link><description>Blog de tecnología, programación y electrónica, para compartir conocimientos, experiencias y tutoriales con este apasionante mundo.</description><generator>Hugo</generator><language>es-CO</language><copyright>Copyright © 2026 DacaDev. All rights reserved.</copyright><lastBuildDate>Mon, 01 Jun 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://blog.dacadev.com/tags/observables/index.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.dacadev.com/images/blog-logo.png</url><title>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</link></image><item><title>RxJs: Operadores básicos</title><link>https://blog.dacadev.com/typescript/rxjs/operadores-basicos-rxjs/</link><pubDate>Mon, 01 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/typescript/rxjs/operadores-basicos-rxjs/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende operadores rxjs esenciales como map, filter, tap, reduce y scan, y domina el operador pipe rxjs para transformar streams.</description><media:content url="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-son-los-operadores-rxjs-y-cómo-funciona-pipe"&gt;Qué son los operadores rxjs y cómo funciona &lt;code&gt;pipe&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#map-transformar-emisiones-con-map-filter-rxjs"&gt;&lt;code&gt;map&lt;/code&gt;: transformar emisiones con &lt;code&gt;map filter rxjs&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pluck-extraer-propiedades-anidadas"&gt;&lt;code&gt;pluck&lt;/code&gt;: extraer propiedades anidadas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#mapto-reemplazar-cada-emisión-por-un-valor-constante"&gt;&lt;code&gt;mapTo&lt;/code&gt;: reemplazar cada emisión por un valor constante&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#filter-filtrar-emisiones-del-stream"&gt;&lt;code&gt;filter&lt;/code&gt;: filtrar emisiones del stream&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#encadenamiento-con-el-operador-pipe-rxjs"&gt;Encadenamiento con el operador pipe rxjs&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tap-efectos-secundarios-sin-transformar-el-flujo"&gt;&lt;code&gt;tap&lt;/code&gt;: efectos secundarios sin transformar el flujo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#reduce-acumular-y-emitir-al-completar"&gt;&lt;code&gt;reduce&lt;/code&gt;: acumular y emitir al completar&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#scan-acumular-y-emitir-cada-estado-intermedio"&gt;&lt;code&gt;scan&lt;/code&gt;: acumular y emitir cada estado intermedio&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En una aplicación reactiva, el problema rara vez consiste solo en recibir eventos; el reto aparece al transformar, filtrar y acumular emisiones sin acoplar la lógica de negocio a cada suscripción. Los &lt;strong&gt;operadores rxjs&lt;/strong&gt; resuelven ese punto al permitir que un &lt;code&gt;Observable&lt;/code&gt; exponga un flujo derivado, más específico y más seguro para quien lo consume.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Este artículo forma parte de la &lt;strong&gt;serie RxJs&lt;/strong&gt;. Venimos de analizar &lt;a href="https://blog.dacadev.com/typescript/funciones-crear-observables/"



 


&gt;Funciones para crear Observables&lt;/a&gt; y aquí abordaremos &lt;code&gt;pipe&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;pluck&lt;/code&gt;, &lt;code&gt;mapTo&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, encadenamiento, &lt;code&gt;tap&lt;/code&gt;, &lt;code&gt;reduce&lt;/code&gt; y &lt;code&gt;scan&lt;/code&gt;. El siguiente paso será estudiar &lt;a href="https://blog.dacadev.com/typescript/operadores-de-tiempo-rxjs/"



 


&gt;Operadores de tiempo&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-son-los-operadores-rxjs-y-cómo-funciona-pipe"&gt;Qué son los operadores rxjs y cómo funciona &lt;code&gt;pipe&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;operador&lt;/strong&gt; es una función que recibe las emisiones de un &lt;code&gt;Observable&lt;/code&gt; y devuelve otro &lt;code&gt;Observable&lt;/code&gt; con un comportamiento derivado. Ese comportamiento puede transformar valores, filtrar emisiones, ejecutar efectos secundarios controlados o acumular estado a lo largo del stream.&lt;/p&gt;
&lt;p&gt;En RxJS, los operadores se aplican con el método &lt;code&gt;pipe&lt;/code&gt;. Esta API permite declarar una cadena de procesamiento explícita, donde cada operador recibe la salida del anterior y entrega su resultado al siguiente. La documentación oficial de &lt;a href="https://rxjs.dev"




 target="_blank"
 


&gt;RxJS&lt;/a&gt; describe este patrón como la base para componer flujos asincrónicos de manera declarativa.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;map&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La suscripción no debería cargar con toda la lógica de transformación. En un diseño mantenible, &lt;code&gt;subscribe&lt;/code&gt; se reserva para consumir el resultado final, mientras que &lt;code&gt;pipe&lt;/code&gt; documenta la estrategia de procesamiento del flujo.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Mantén la lógica de transformación dentro de &lt;code&gt;pipe&lt;/code&gt;. Esto reduce acoplamiento, facilita pruebas unitarias sobre operadores y evita suscripciones con demasiada responsabilidad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="map-transformar-emisiones-con-map-filter-rxjs"&gt;&lt;code&gt;map&lt;/code&gt;: transformar emisiones con &lt;code&gt;map filter rxjs&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;map&lt;/code&gt;&lt;/strong&gt; proyecta cada emisión del &lt;code&gt;Observable&lt;/code&gt; original hacia un nuevo valor. Es equivalente al concepto de proyección funcional: por cada entrada existe una salida, sin modificar el origen y sin alterar la cantidad de emisiones.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-map_hu_e00f6d1ff71d0bd5.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;En el diagrama de canicas, cada valor emitido pasa por una función de transformación y continúa en el stream resultante con una nueva representación. Esto permite convertir modelos, normalizar datos o derivar valores calculados antes de que lleguen a la suscripción.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;map&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;source$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;multiplied$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;source$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;number&lt;/span&gt;&amp;gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;source$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;source&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;multiplied$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;map&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También puedes escribirlo de forma compacta cuando no necesitas conservar una referencia al &lt;code&gt;Observable&lt;/code&gt; intermedio:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;map&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;number&lt;/span&gt;&amp;gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado conserva el orden de las emisiones y aplica la función a cada valor individual.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-map_hu_e21585c67d7ecd41.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;&lt;code&gt;map&lt;/code&gt; es una pieza central en pipelines donde necesitas convertir eventos del DOM, respuestas HTTP o estructuras de dominio en datos listos para la capa que los consume.&lt;/p&gt;
&lt;h2 id="pluck-extraer-propiedades-anidadas"&gt;&lt;code&gt;pluck&lt;/code&gt;: extraer propiedades anidadas&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;pluck&lt;/code&gt;&lt;/strong&gt; extrae propiedades de objetos emitidos por un &lt;code&gt;Observable&lt;/code&gt;. En notas y proyectos con RxJS más antiguos aparece con frecuencia para leer rutas como &lt;code&gt;target.baseURI&lt;/code&gt; dentro de un evento del DOM.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-pluck_hu_5426da1479087d60.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Un ejemplo clásico consiste en escuchar eventos &lt;code&gt;keyup&lt;/code&gt; y extraer una propiedad anidada del objeto &lt;code&gt;KeyboardEvent&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;pluck&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs/operators&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;KeyboardEvent&lt;/span&gt;&amp;gt;(&lt;span style="color:#e5c07b"&gt;document&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;keyup&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;baseUri$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;pluck&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;target&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;baseURI&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;baseUri$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;pluck&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al presionar una tecla, el &lt;code&gt;Observable&lt;/code&gt; original emite el evento completo, mientras que el stream derivado emite solo la propiedad seleccionada.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-pluck_hu_3b2445a8681576fe.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 






 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;pluck&lt;/code&gt; está deprecado en versiones modernas de RxJS. Prefiere &lt;code&gt;map&lt;/code&gt; con acceso explícito a propiedades, porque ofrece mejor tipado, autocompletado y refactorización segura.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La alternativa recomendada usa &lt;code&gt;map&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;map&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;KeyboardEvent&lt;/span&gt;&amp;gt;(&lt;span style="color:#e5c07b"&gt;document&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;keyup&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;baseUri$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;event&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;event&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;target&lt;/span&gt; &lt;span style="color:#c678dd"&gt;instanceof&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Element&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;?&lt;/span&gt; &lt;span style="color:#e06c75"&gt;event&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;target&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;baseURI&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;baseUri$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;baseURI&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mapto-reemplazar-cada-emisión-por-un-valor-constante"&gt;&lt;code&gt;mapTo&lt;/code&gt;: reemplazar cada emisión por un valor constante&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;mapTo&lt;/code&gt;&lt;/strong&gt; transforma cualquier entrada en un valor constante. Es útil cuando el contenido de la emisión original no importa y solo necesitas representar una señal semántica, por ejemplo: “hubo interacción”, “se presionó una tecla” o “se completó un paso”.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-map-to_hu_8f3f642b0c00aa40.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;mapTo&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;KeyboardEvent&lt;/span&gt;&amp;gt;(&lt;span style="color:#e5c07b"&gt;document&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;keyup&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyPressed$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyup$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;mapTo&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Tecla presionada&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;keyPressed$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;mapTo&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cada evento &lt;code&gt;keyup&lt;/code&gt; se reemplaza por la misma cadena.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-map-to_hu_cbac4f701b02c8cc.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;En código moderno, también puedes usar &lt;code&gt;map(() =&amp;gt; valor)&lt;/code&gt; para lograr el mismo resultado y mantener consistencia con el resto de tus transformaciones.&lt;/p&gt;
&lt;h2 id="filter-filtrar-emisiones-del-stream"&gt;&lt;code&gt;filter&lt;/code&gt;: filtrar emisiones del stream&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/strong&gt; deja pasar únicamente las emisiones que cumplen un predicado. A diferencia de &lt;code&gt;map&lt;/code&gt;, este operador sí puede cambiar la cantidad de emisiones que recibe la suscripción, porque descarta los valores que no satisfacen la condición.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-filter_hu_1050d12e416827c.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;El callback de &lt;code&gt;filter&lt;/code&gt; recibe el valor emitido y el índice de la emisión. Esto permite aplicar reglas basadas en el contenido del valor o en su posición dentro del stream.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;filter&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;10&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;filter&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;index&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;index&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;index&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este caso, solo pasan los números impares.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-filter-numbers_hu_2e6f024c6af9ed48.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;&lt;code&gt;filter&lt;/code&gt; también es útil con objetos de dominio. El siguiente ejemplo convierte un arreglo en un &lt;code&gt;Observable&lt;/code&gt; y deja pasar únicamente los personajes de tipo &lt;code&gt;heroe&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;from&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;filter&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Personaje&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;tipo&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;heroe&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;villano&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;nombre&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;personajes&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Personaje&lt;/span&gt;[] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#e06c75"&gt;tipo&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;heroe&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;nombre&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Batman&amp;#39;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#e06c75"&gt;tipo&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;heroe&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;nombre&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Robin&amp;#39;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#e06c75"&gt;tipo&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;villano&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;nombre&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Joker&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;personajes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;filter&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;personaje&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;personaje&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;tipo&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;heroe&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;personaje&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;filter&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;personaje&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El stream resultante contiene solo los objetos que cumplen el predicado.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-filter-objects_hu_33a3b6d187cd0d2a.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 






 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;filter&lt;/code&gt; no transforma el valor; controla si una emisión continúa o se descarta. Si necesitas modificar el valor después del filtrado, encadena un &lt;code&gt;map&lt;/code&gt; a continuación.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="encadenamiento-con-el-operador-pipe-rxjs"&gt;Encadenamiento con el operador pipe rxjs&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;operador pipe rxjs&lt;/strong&gt; permite componer varios operadores en una secuencia legible. Cada paso debería tener una responsabilidad clara: extraer un dato, filtrar una condición, transformar un modelo o ejecutar un efecto secundario controlado.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;filter&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;map&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;enterKey$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fromEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;KeyboardEvent&lt;/span&gt;&amp;gt;(&lt;span style="color:#e5c07b"&gt;document&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;keyup&amp;#39;&lt;/span&gt;).&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;event&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;event&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;code&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;filter&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;keyCode&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;keyCode&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Enter&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;enterKey$&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;keyCode&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;chain&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;keyCode&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí el primer operador transforma &lt;code&gt;KeyboardEvent&lt;/code&gt; en &lt;code&gt;event.code&lt;/code&gt;, y el segundo operador deja pasar únicamente la tecla &lt;code&gt;Enter&lt;/code&gt;. La suscripción recibe un stream ya procesado, sin conocer el detalle del evento original del DOM.&lt;/p&gt;
&lt;p&gt;Esta composición es especialmente importante cuando el flujo crece. En lugar de acumular lógica imperativa dentro de callbacks, puedes expresar el pipeline de datos como una serie de transformaciones pequeñas y verificables.&lt;/p&gt;
&lt;h2 id="tap-efectos-secundarios-sin-transformar-el-flujo"&gt;&lt;code&gt;tap&lt;/code&gt;: efectos secundarios sin transformar el flujo&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;tap&lt;/code&gt;&lt;/strong&gt; ejecuta efectos secundarios sobre las emisiones, pero no modifica el valor que atraviesa el pipeline. Es una herramienta frecuente para depuración, métricas, logging o integración con observabilidad, siempre que no se use para alterar estado crítico de forma opaca.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-tap_hu_ca400b88414de95b.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;tap&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;numbers$&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;numbers$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;tap&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;tap-antes&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;map&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;tap&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;next&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;tap-despues&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;complete&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; () &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;se terminó todo&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;subs&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tap&lt;/code&gt; acepta un callback para &lt;code&gt;next&lt;/code&gt; o un objeto con handlers como &lt;code&gt;next&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt; y &lt;code&gt;complete&lt;/code&gt;. En ambos casos, el valor que continúa hacia el siguiente operador permanece intacto.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-tap_hu_1fd193b2a444489d.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 






 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Evita usar &lt;code&gt;tap&lt;/code&gt; como sustituto de &lt;code&gt;map&lt;/code&gt; o &lt;code&gt;filter&lt;/code&gt;. Si un paso cambia el valor del stream, debe expresarse con un operador de transformación explícito.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="reduce-acumular-y-emitir-al-completar"&gt;&lt;code&gt;reduce&lt;/code&gt;: acumular y emitir al completar&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;reduce&lt;/code&gt;&lt;/strong&gt; aplica una función acumuladora sobre las emisiones y entrega un único resultado cuando el &lt;code&gt;Observable&lt;/code&gt; completa. Su comportamiento es apropiado para streams finitos, como arreglos, rangos o secuencias delimitadas con operadores como &lt;code&gt;take&lt;/code&gt;.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-reduce_hu_c634ff5213a00ec4.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;interval&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;take&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;tap&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;totalReducer&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;accumulator&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;current&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;accumulator&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;current&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;interval&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;500&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;take&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;6&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;tap&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;totalReducer&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;next&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;next&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;complete&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; () &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;complete&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El segundo argumento de &lt;code&gt;reduce&lt;/code&gt; define el valor inicial del acumulador. En el ejemplo, el acumulador inicia en &lt;code&gt;5&lt;/code&gt;, procesa seis emisiones del &lt;code&gt;interval&lt;/code&gt; y emite el total solo cuando &lt;code&gt;take(6)&lt;/code&gt; completa el flujo.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-reduce_hu_a2831c73d34ffa4b.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 






 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;reduce&lt;/code&gt; necesita que el &lt;code&gt;Observable&lt;/code&gt; complete para emitir el resultado. En streams infinitos o de larga vida, como eventos del DOM sin delimitador, no recibirás salida si no aplicas un operador que cierre la secuencia.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="scan-acumular-y-emitir-cada-estado-intermedio"&gt;&lt;code&gt;scan&lt;/code&gt;: acumular y emitir cada estado intermedio&lt;/h2&gt;
&lt;p&gt;El operador &lt;strong&gt;&lt;code&gt;scan&lt;/code&gt;&lt;/strong&gt; también aplica una función acumuladora, pero emite cada estado intermedio del acumulador. Esta diferencia lo convierte en una pieza clave para modelar estado reactivo: contadores, historial de acciones, progreso incremental o snapshots derivados de eventos.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/marble-scan_hu_104ac87779ead247.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;Comparar &lt;code&gt;reduce&lt;/code&gt; y &lt;code&gt;scan&lt;/code&gt; sobre la misma secuencia deja clara la diferencia operativa.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;import&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;from&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;scan&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;rxjs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;numbers&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;totalAccumulator&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;accumulator&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;current&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;accumulator&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;current&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;numbers&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;totalAccumulator&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;reduce&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;numbers&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;pipe&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;scan&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;totalAccumulator&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e06c75"&gt;subscribe&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;scan&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;reduce&lt;/code&gt; emite solo el total final. &lt;code&gt;scan&lt;/code&gt; emite &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;, &lt;code&gt;6&lt;/code&gt;, &lt;code&gt;10&lt;/code&gt; y &lt;code&gt;15&lt;/code&gt;, porque cada emisión representa el nuevo estado acumulado.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/typescript/rxjs/basic-operators/console-reduce-scan_hu_9b17532d32728e9f.webp"
 alt="Imagen guia del contenido de la página"style="width:600px"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;En arquitecturas reactivas, &lt;code&gt;scan&lt;/code&gt; suele ser más útil que &lt;code&gt;reduce&lt;/code&gt; cuando el consumidor necesita reaccionar a cada transición de estado, no solo al resultado final.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los operadores básicos de RxJS permiten convertir streams genéricos en flujos especializados y mantenibles. &lt;code&gt;map&lt;/code&gt; transforma, &lt;code&gt;filter&lt;/code&gt; controla qué continúa, &lt;code&gt;tap&lt;/code&gt; observa sin modificar, &lt;code&gt;reduce&lt;/code&gt; acumula hasta completar y &lt;code&gt;scan&lt;/code&gt; expone cada estado acumulado.&lt;/p&gt;
&lt;p&gt;Dominar &lt;code&gt;pipe&lt;/code&gt; y estos operadores establece una base sólida para operadores más avanzados. En el siguiente artículo de la serie abordaremos operadores de tiempo, donde la latencia, la frecuencia de emisión y la coordinación temporal pasan a ser parte central del diseño reactivo.&lt;/p&gt;</content:encoded></item></channel></rss>