<?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>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</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>Wed, 24 Jun 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://blog.dacadev.com/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>Síndrome del impostor: cómo identificarlo y superarlo</title><link>https://blog.dacadev.com/soft-skills/sindrome-del-impostor/</link><pubDate>Wed, 24 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/soft-skills/sindrome-del-impostor/</guid><dc:creator>Dacadev</dc:creator><category>habilidades blandas</category><description>Descubre qué es el síndrome del impostor, cómo lo procesa tu cerebro y qué herramientas usar para superarlo e impulsar tu carrera profesional.</description><media:content url="https://blog.dacadev.com/images/soft-skills/impostor-syndrome/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="#cómo-funciona-el-cerebro-ante-el-síndrome-del-impostor"&gt;Cómo funciona el cerebro ante el síndrome del impostor&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#improntas"&gt;Improntas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#neuroplasticidad"&gt;Neuroplasticidad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#neofobia"&gt;Neofobia&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-se-siente-el-síndrome-del-impostor"&gt;Cómo se siente el síndrome del impostor&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-síndrome-del-impostor-frena-tus-objetivos"&gt;El síndrome del impostor frena tus objetivos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#herramientas-para-superar-el-síndrome-del-impostor"&gt;Herramientas para superar el síndrome del impostor&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-gratitud"&gt;La gratitud&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#referentes"&gt;Referentes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conversa-diariamente-contigo-mismo"&gt;Conversa diariamente contigo mismo&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&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;Acabas de cerrar un proyecto complejo, tu equipo te felicita y, en lugar de satisfacción, sientes una incomodidad difusa: la sensación de que en cualquier momento alguien va a descubrir que no eras la persona adecuada para el puesto. Esa voz persistente que minimiza tus logros y amplifica tus dudas tiene nombre: el &lt;strong&gt;síndrome del impostor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;El síndrome del impostor es un sentimiento persistente de inseguridad a pesar del éxito. Quien lo padece se siente incapaz de aceptar sus logros, con un miedo profundo a fracasar o a que se descubra una supuesta incapacidad. Más allá de lo incómodo, es una barrera real para el avance profesional y la satisfacción personal.&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;Aprender a manejar el síndrome del impostor puede disparar tu perfil profesional y personal. En este artículo abordaremos tres ejes: cómo funciona tu cerebro frente a este fenómeno, cómo identificar si lo estás sufriendo y qué herramientas concretas usar para combatirlo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Para entenderlo y combatirlo con eficacia, necesitamos comprender tres cosas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cómo funciona el cerebro ante el síndrome del impostor.&lt;/li&gt;
&lt;li&gt;Cómo identificar si lo estás padeciendo.&lt;/li&gt;
&lt;li&gt;Cómo combatirlo.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="cómo-funciona-el-cerebro-ante-el-síndrome-del-impostor"&gt;Cómo funciona el cerebro ante el síndrome del impostor&lt;/h2&gt;
&lt;p&gt;El cerebro de las personas que experimentan el síndrome del impostor tiende a responder de forma desproporcionada ante situaciones estresantes. Esa respuesta exagerada genera la sensación de estar fracasando incluso después de haber tenido éxito, produciendo inseguridad crónica y vergüenza.&lt;/p&gt;
&lt;p&gt;A nivel emocional, esto se traduce en ansiedad, auto-duda y pensamientos recurrentes de impostor. Sostenidos en el tiempo, esos estados conducen a una baja autoestima y a una sensación de desesperanza que afecta tanto el rendimiento como el bienestar.&lt;/p&gt;
&lt;p&gt;Para entender el mecanismo, conviene observar el cerebro desde un modelo de tres capas funcionales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Racional&lt;/strong&gt;: la parte más analítica, encargada del pensamiento profundo y la toma de decisiones deliberadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emocional&lt;/strong&gt;: la responsable de las emociones que experimentamos. Aunque podemos regularlas, son parte inseparable de nuestra naturaleza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reptil&lt;/strong&gt;: la capa encargada de la supervivencia, donde residen los instintos más primitivos cuya función es mantenernos vivos.&lt;/li&gt;
&lt;/ul&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;strong&gt;Como dato relevante:&lt;/strong&gt; el cerebro tiende a recordar con más fuerza las experiencias negativas que las positivas. Este sesgo de negatividad explica por qué un comentario crítico pesa más que diez elogios.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Dentro de la capa reptil, el cerebro modela sus creencias y respuestas de supervivencia. Muchas de esas respuestas son &lt;strong&gt;improntas&lt;/strong&gt; que se graban principalmente entre los 0 y los 10 años, aunque pueden seguir formándose en etapas posteriores de la vida.&lt;/p&gt;
&lt;h3 id="improntas"&gt;Improntas&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;improntas&lt;/strong&gt; son patrones de comportamiento que se asocian con experiencias y quedan grabados en la memoria y el subconsciente. Se forman sobre todo a partir de vivencias de la infancia, pero experiencias posteriores también pueden reforzarlas o modificarlas.&lt;/p&gt;
&lt;p&gt;Estas improntas programan nuestras reacciones de manera inconsciente y pueden ser positivas, negativas o neutrales, según la experiencia que las origina.&lt;/p&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;El síndrome del impostor es una &lt;strong&gt;impronta negativa&lt;/strong&gt; que se forma cuando una persona experimenta sentimientos repetidos de inseguridad o culpa. Cambiarla es difícil, pero perfectamente posible con las herramientas adecuadas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las improntas de mayor impacto, sean positivas o negativas, se conocen como &lt;strong&gt;improntas somáticas&lt;/strong&gt;, porque su huella es tan profunda que el cuerpo y la mente las registran como verdades absolutas.&lt;/p&gt;
&lt;h3 id="neuroplasticidad"&gt;Neuroplasticidad&lt;/h3&gt;
&lt;p&gt;La &lt;strong&gt;neuroplasticidad&lt;/strong&gt; es el proceso mediante el cual el cerebro cambia con el tiempo en función de nuestras experiencias. Los circuitos neuronales se reorganizan para adaptarse a las nuevas condiciones de nuestra vida, lo que sustenta nuestra capacidad de aprender, recordar, olvidar y modificar el comportamiento.&lt;/p&gt;
&lt;p&gt;Esta plasticidad es justamente la razón por la que el síndrome del impostor no es una sentencia permanente. Si una impronta negativa pudo grabarse, otra más saludable puede sustituirla.&lt;/p&gt;
&lt;p&gt;Herramientas como la meditación y la terapia aprovechan la neuroplasticidad para mejorar la salud mental: nos ayudan a regular emociones y pensamientos, y con ello a desactivar progresivamente los patrones que alimentan el síndrome del impostor.&lt;/p&gt;
&lt;h3 id="neofobia"&gt;Neofobia&lt;/h3&gt;
&lt;p&gt;La &lt;strong&gt;neofobia&lt;/strong&gt; es un miedo irracional a lo nuevo o desconocido. Puede desencadenarse por una experiencia traumática o por algo aparentemente trivial, como una conversación que dejó una marca.&lt;/p&gt;
&lt;p&gt;Con frecuencia la neofobia se asocia con el síndrome del impostor, ya que la persona se siente incapaz de afrontar situaciones nuevas y, por tanto, evita exponerse a ellas. El resultado suele ser ansiedad, desánimo y una erosión progresiva de la confianza.&lt;/p&gt;
&lt;p&gt;Para contrarrestarla es clave trabajar la autoestima y aprender a gestionar la ansiedad. También ayuda exponerse de forma gradual a lo desconocido, aplicando un enfoque de aceptación y compromiso en lugar de evitación.&lt;/p&gt;
&lt;h2 id="cómo-se-siente-el-síndrome-del-impostor"&gt;Cómo se siente el síndrome del impostor&lt;/h2&gt;
&lt;p&gt;El mito de &lt;strong&gt;&amp;ldquo;todavía no estoy listo&amp;rdquo;&lt;/strong&gt; es uno de los síntomas centrales del síndrome del impostor. Esa creencia instala la idea de que nunca llegará el momento adecuado para dar un paso, lo que genera inseguridad, sensación de inadecuación y pérdida de control.&lt;/p&gt;
&lt;p&gt;En la práctica, ese mito dificulta la toma de decisiones, la ejecución de tareas y la búsqueda de nuevas oportunidades. Esperamos una preparación total que, simplemente, nunca llega.&lt;/p&gt;
&lt;p&gt;Para desactivarlo conviene asumir que no existe un punto exacto en el que estés completamente preparado para algo: la preparación es un &lt;strong&gt;proceso continuo&lt;/strong&gt;. Aceptar el aprendizaje y los errores como parte natural del camino fortalece la confianza en tus propias capacidades. Tomar riesgos calculados y explorar nuevas oportunidades acelera ese desarrollo.&lt;/p&gt;
&lt;h3 id="el-síndrome-del-impostor-frena-tus-objetivos"&gt;El síndrome del impostor frena tus objetivos&lt;/h3&gt;
&lt;p&gt;El síndrome del impostor puede convertirse en un obstáculo directo para cumplir tus metas. La inseguridad y la auto-duda que provoca te hacen sentir incapaz de decidir y de afrontar lo nuevo, al punto de abandonar proyectos antes incluso de comenzarlos.&lt;/p&gt;
&lt;p&gt;El miedo a fracasar agrava el cuadro: puede abrumarte justo cuando estás cerca de lograr tu objetivo, haciéndote creer que no podrás continuar. Así, una barrera puramente interna termina bloqueando avances que estaban a tu alcance.&lt;/p&gt;
&lt;p&gt;Para evitar que te limite, es esencial trabajar la autoestima y aprender a gestionar tus emociones. Esto te permite enfrentar tus miedos, aceptar los errores como parte del proceso y reconstruir la confianza necesaria para abrazar nuevos desafíos.&lt;/p&gt;
&lt;h2 id="herramientas-para-superar-el-síndrome-del-impostor"&gt;Herramientas para superar el síndrome del impostor&lt;/h2&gt;
&lt;h3 id="la-gratitud"&gt;La gratitud&lt;/h3&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;🚀 El agradecimiento es la memoria del corazón.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La &lt;strong&gt;gratitud&lt;/strong&gt; es una herramienta poderosa para combatir el síndrome del impostor porque reorienta el foco hacia lo positivo, incluso cuando la sensación de fracaso domina. Nos ayuda a encontrar el propósito detrás de los tropiezos y a extraer aprendizaje de ellos.&lt;/p&gt;
&lt;p&gt;Además, la gratitud nos obliga a reconocer nuestras fortalezas y logros. Ese reconocimiento genera orgullo y confianza, dos antídotos directos contra la auto-duda, y nos permite afrontar situaciones nuevas con mayor seguridad.&lt;/p&gt;
&lt;p&gt;Por último, agradecer nos recuerda que nuestros esfuerzos son apreciados y valorados. Esa certeza reduce el miedo al fracaso y al &amp;ldquo;descubrimiento&amp;rdquo; de una supuesta incapacidad, facilitando decisiones más firmes.&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;Cuando tu pensamiento es positivo, se genera una emoción positiva; y cuando vibras con una emoción positiva, las acciones que emprendes también lo serán. El ciclo pensamiento → emoción → acción funciona en ambas direcciones.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="referentes"&gt;Referentes&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;referentes&lt;/strong&gt; son personas que nos inspiran y nos impulsan a crecer: familiares, amigos, mentores o incluso figuras públicas. Su función es darnos el empuje para avanzar hacia nuestros objetivos y ayudarnos a ver el lado constructivo de las dificultades.&lt;/p&gt;
&lt;p&gt;Un buen referente eleva la confianza porque nos muestra, con evidencia concreta, que es posible lograr cosas grandes. Esa perspectiva nos invita a valorar de forma más realista nuestras propias habilidades y logros.&lt;/p&gt;
&lt;p&gt;Los referentes también nos recuerdan que somos responsables de nuestra propia trayectoria. Adoptar esa responsabilidad nos permite ver el fracaso como parte del aprendizaje y mantener la motivación incluso cuando el camino se complica. Con ello, el éxito deja de ser una abstracción y se convierte en una posibilidad real.&lt;/p&gt;
&lt;h3 id="conversa-diariamente-contigo-mismo"&gt;Conversa diariamente contigo mismo&lt;/h3&gt;
&lt;p&gt;Mantener un &lt;strong&gt;diálogo interno consciente&lt;/strong&gt; es una de las herramientas más efectivas para construir confianza. Conversar contigo mismo te ayuda a conocerte mejor, a tomar conciencia de tus logros y a identificar tus fortalezas reales.&lt;/p&gt;
&lt;p&gt;Ese diálogo también te permite comprender mejor tus emociones y pensamientos, lo que se traduce en decisiones más acertadas y en una mejor respuesta ante situaciones nuevas. El fracaso pasa a interpretarse como experiencia de aprendizaje y el éxito como un objetivo alcanzable.&lt;/p&gt;
&lt;p&gt;Con el tiempo, conversar contigo mismo desarrolla una actitud más positiva hacia la vida: te ayuda a encontrar propósito en los tropiezos, a reforzar tu autoestima y a consolidar la confianza en tus propias capacidades.&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;🚀 La historia que te cuentas es la que manifiestas. Cambia la narrativa interna y empezarás a cambiar los resultados externos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El síndrome del impostor no es un rasgo permanente ni una sentencia, sino una &lt;strong&gt;impronta negativa&lt;/strong&gt; que tu cerebro grabó en algún momento y que la neuroplasticidad te permite reescribir. Comprender cómo opera tu mente, reconocer los síntomas a tiempo y aplicar herramientas como la gratitud, los referentes y el diálogo interno son pasos concretos para recuperar la confianza.&lt;/p&gt;
&lt;p&gt;El objetivo no es eliminar por completo la duda —algo de incertidumbre es parte de todo crecimiento— sino impedir que esa duda dicte tus decisiones. Cuando aprendes a aceptar tus logros y a ver el fracaso como aprendizaje, conviertes una barrera interna en un impulso para tu desarrollo profesional y personal.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Depuración de errores y tsconfig.json</title><link>https://blog.dacadev.com/programacion/typescript/depuracion-y-tsconfig/</link><pubDate>Wed, 24 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/depuracion-y-tsconfig/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Configura el compilador de TypeScript con tsconfig.json: strict, noImplicitAny, removeComments, sourceMap y salida única para depurar y compilar mejor.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/debugging-tsconfig/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é-es-tsconfigjson-y-para-qué-sirve"&gt;Qué es tsconfig.json y para qué sirve&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#opciones-recomendadas"&gt;Opciones recomendadas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#sourcemap-depurar-el-código-original"&gt;sourceMap: depurar el código original&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#generar-un-único-archivo-de-salida"&gt;Generar un único archivo de salida&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#depurar-errores-con-eficacia"&gt;Depurar errores con eficacia&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;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;Artículo final de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Consolidaremos la configuración del compilador mediante &lt;code&gt;tsconfig.json&lt;/code&gt; y las opciones que facilitan la depuración y mejoran la calidad del código emitido.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El archivo &lt;code&gt;tsconfig.json&lt;/code&gt; es el centro de control del compilador: define cómo TypeScript interpreta, verifica y transforma tu proyecto. Una configuración bien afinada no solo previene errores, sino que mejora la experiencia de depuración y la calidad del JavaScript resultante. Cerremos la serie dominando esta pieza. La referencia completa está en la &lt;a href="https://www.typescriptlang.org/docs/handbook/tsconfig-json.html"




 target="_blank"
 


&gt;documentación oficial de tsconfig.json&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="qué-es-tsconfigjson-y-para-qué-sirve"&gt;Qué es tsconfig.json y para qué sirve&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tsconfig.json&lt;/code&gt; declara el comportamiento del compilador para todo el proyecto. Cuando se genera por primera vez, muchas opciones aparecen comentadas, y el valor mostrado en el comentario suele ser el recomendado por defecto.&lt;/p&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;La presencia de un &lt;code&gt;tsconfig.json&lt;/code&gt; en un directorio marca la raíz de un proyecto TypeScript. Ejecutar &lt;code&gt;tsc&lt;/code&gt; sin argumentos hace que el compilador busque este archivo y compile según sus reglas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="opciones-recomendadas"&gt;Opciones recomendadas&lt;/h2&gt;
&lt;p&gt;Estas opciones de &lt;code&gt;compilerOptions&lt;/code&gt; aportan el mayor valor en un proyecto profesional:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;strict&lt;/code&gt;: activa el conjunto completo de comprobaciones estrictas. Es la opción que más errores previene.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noImplicitAny&lt;/code&gt;: prohíbe que TypeScript asigne &lt;code&gt;any&lt;/code&gt; de forma implícita cuando no puede inferir un tipo, obligándote a ser explícito.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;removeComments&lt;/code&gt;: elimina los comentarios del JavaScript compilado, produciendo una salida más limpia.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sourceMap&lt;/code&gt;: genera &lt;em&gt;source maps&lt;/em&gt; que enlazan el JavaScript emitido con tu código TypeScript original.&lt;/li&gt;
&lt;/ul&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-json" data-lang="json"&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;&amp;#34;compilerOptions&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;strict&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;noImplicitAny&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;removeComments&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;sourceMap&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;target&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;es2015&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;module&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;commonjs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;outDir&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;dist&amp;#34;&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;&amp;#34;include&amp;#34;&lt;/span&gt;: [&lt;span style="color:#98c379"&gt;&amp;#34;src&amp;#34;&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;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;&lt;code&gt;strict&lt;/code&gt; es en realidad un &lt;em&gt;paraguas&lt;/em&gt; que activa varias comprobaciones, entre ellas &lt;code&gt;noImplicitAny&lt;/code&gt;, &lt;code&gt;strictNullChecks&lt;/code&gt; y &lt;code&gt;strictFunctionTypes&lt;/code&gt;. Habilitarlo desde el primer commit evita una migración costosa cuando el proyecto ya acumuló tipos implícitos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="sourcemap-depurar-el-código-original"&gt;sourceMap: depurar el código original&lt;/h2&gt;
&lt;p&gt;Sin &lt;em&gt;source maps&lt;/em&gt;, cuando depuras en el navegador o en Node solo ves el JavaScript transpilado, que puede diferir notablemente de tu TypeScript. Con &lt;code&gt;sourceMap: true&lt;/code&gt;, el compilador genera archivos &lt;code&gt;.js.map&lt;/code&gt; que permiten al depurador mostrar tu código fuente original, colocar &lt;em&gt;breakpoints&lt;/em&gt; en él e inspeccionar variables con sus nombres reales.&lt;/p&gt;
&lt;p&gt;Esta opción es la diferencia entre depurar el código que escribiste y depurar el código que la máquina generó.&lt;/p&gt;
&lt;h2 id="generar-un-único-archivo-de-salida"&gt;Generar un único archivo de salida&lt;/h2&gt;
&lt;p&gt;Para ciertos escenarios —especialmente proyectos de frontend sin un &lt;em&gt;bundler&lt;/em&gt;— resulta útil concatenar toda la salida en un solo archivo JavaScript. Esto se logra con la opción &lt;code&gt;outFile&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-json" data-lang="json"&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;&amp;#34;compilerOptions&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;outFile&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;./main.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;sourceMap&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;removeComments&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&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;/code&gt;&lt;/pre&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;outFile&lt;/code&gt; solo funciona con los sistemas de módulos &lt;code&gt;amd&lt;/code&gt; y &lt;code&gt;system&lt;/code&gt;; no es compatible con &lt;code&gt;commonjs&lt;/code&gt; ni &lt;code&gt;esnext&lt;/code&gt;. En proyectos modernos, lo habitual es delegar el empaquetado a herramientas como webpack o esbuild en lugar de usar &lt;code&gt;outFile&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="depurar-errores-con-eficacia"&gt;Depurar errores con eficacia&lt;/h2&gt;
&lt;p&gt;El flujo de depuración en TypeScript combina las opciones anteriores con la lectura disciplinada de los mensajes del compilador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cada error incluye un &lt;strong&gt;código&lt;/strong&gt; (por ejemplo &lt;code&gt;TS2345&lt;/code&gt;) que puedes buscar para entender su causa raíz.&lt;/li&gt;
&lt;li&gt;Con &lt;code&gt;strict&lt;/code&gt; activo, los errores afloran en compilación, antes de ejecutar el código.&lt;/li&gt;
&lt;li&gt;Con &lt;code&gt;sourceMap&lt;/code&gt;, los errores en tiempo de ejecución apuntan a tu TypeScript original, no al JavaScript emitido.&lt;/li&gt;
&lt;li&gt;El modo observador (&lt;code&gt;tsc --watch&lt;/code&gt;) reporta los errores de forma incremental mientras escribes.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[Código TS] --&gt; B[tsc con strict]
 B -- error de tipo --&gt; C[Mensaje TSxxxx&lt;br/&gt;en compilación]
 B -- ok --&gt; D[JS + sourceMap]
 D --&gt; E[Runtime]
 E -- error --&gt; F[Stack trace sobre TS&lt;br/&gt;gracias al sourceMap]
&lt;/pre&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tsconfig.json&lt;/code&gt; es la herramienta que transforma TypeScript de un transpilador genérico en un compilador afinado a tu proyecto. Activar &lt;code&gt;strict&lt;/code&gt; y &lt;code&gt;noImplicitAny&lt;/code&gt; maximiza la detección temprana de errores; &lt;code&gt;sourceMap&lt;/code&gt; hace que la depuración opere sobre tu código real; y &lt;code&gt;removeComments&lt;/code&gt; pule la salida. Dominar estas opciones cierra el ciclo: del tipado en el editor a la depuración en producción.&lt;/p&gt;
&lt;p&gt;Con esto concluye la serie sobre TypeScript. Has recorrido desde la instalación y los tipos básicos hasta los genéricos, los decoradores y la configuración del compilador: el conjunto de herramientas necesario para construir aplicaciones robustas y mantenibles con tipado estático.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Namespaces, módulos e importaciones</title><link>https://blog.dacadev.com/programacion/typescript/namespaces-y-modulos/</link><pubDate>Tue, 23 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/namespaces-y-modulos/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Organiza tu código en TypeScript con namespaces y módulos ES: exportaciones nombradas, import, alias, export default y archivos barrel con index.ts.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/namespaces-modules/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="#namespaces"&gt;Namespaces&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#módulos-export-e-import"&gt;Módulos: export e import&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#archivos-barrel-centralizar-exportaciones"&gt;Archivos barrel: centralizar exportaciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#export-alias"&gt;Export alias&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#export-default"&gt;Export default&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#del-código-a-un-bundle"&gt;Del código a un bundle&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;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;Décimo artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Organizaremos el código con namespaces y módulos ES: exportaciones nombradas, &lt;code&gt;import&lt;/code&gt;, alias, &lt;code&gt;export default&lt;/code&gt; y archivos &lt;em&gt;barrel&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A medida que un proyecto crece, la organización del código deja de ser un detalle estético para convertirse en un factor de mantenibilidad. TypeScript ofrece dos mecanismos para estructurar el código: los &lt;strong&gt;namespaces&lt;/strong&gt; —agrupadores internos— y los &lt;strong&gt;módulos ES&lt;/strong&gt; —el estándar moderno basado en &lt;code&gt;export&lt;/code&gt; e &lt;code&gt;import&lt;/code&gt;. Analicemos cuándo usar cada uno.&lt;/p&gt;
&lt;h2 id="namespaces"&gt;Namespaces&lt;/h2&gt;
&lt;p&gt;Un namespace agrupa funciones, clases y variables relacionadas bajo un identificador común, exponiendo solo lo que marques con &lt;code&gt;export&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;namespace&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Validations&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;validateText&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;text&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&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;text&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;length&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&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;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;validateDate&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;myDate&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Date&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&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:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;isNaN&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;myDate&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;valueOf&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Validations&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;validateText&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;hola mundo&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Solo los miembros exportados (&lt;code&gt;validateText&lt;/code&gt;, &lt;code&gt;validateDate&lt;/code&gt;) son accesibles desde fuera mediante la notación &lt;code&gt;Namespace.miembro&lt;/code&gt;.&lt;/p&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;Los namespaces se usan cada vez menos en el desarrollo de aplicaciones, donde los módulos ES son el estándar. Sin embargo, siguen presentes como base interna de muchos frameworks y de archivos de definición de tipos (&lt;code&gt;.d.ts&lt;/code&gt;).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="módulos-export-e-import"&gt;Módulos: export e import&lt;/h2&gt;
&lt;p&gt;Los módulos son el mecanismo recomendado. Cada archivo es un módulo y expone su API con &lt;code&gt;export&lt;/code&gt;; otros archivos la consumen con &lt;code&gt;import&lt;/code&gt;. Para exportar, antepón &lt;code&gt;export&lt;/code&gt; a la declaració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:#7f848e"&gt;// classes/Heros.ts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hero&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;powerID&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y para consumirla, usa &lt;code&gt;import&lt;/code&gt; con desestructuración de los miembros nombrados:&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:#7f848e"&gt;// index.ts
&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;Hero&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;./classes/Heros&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;spiderman&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Hero&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hero&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Spiderman&amp;#39;&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;23&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="archivos-barrel-centralizar-exportaciones"&gt;Archivos barrel: centralizar exportaciones&lt;/h2&gt;
&lt;p&gt;Cuando una carpeta agrupa varios módulos relacionados, importarlos uno a uno desde rutas distintas se vuelve tedioso. Un archivo &lt;em&gt;barrel&lt;/em&gt; —convencionalmente un &lt;code&gt;index.ts&lt;/code&gt; dentro de la carpeta— reexporta todo desde un único punto de entrada:&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:#7f848e"&gt;// interfaces/index.ts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;Hero&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;./hero&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;export&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;Villain&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;./villain&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esto permite importar múltiples miembros refiriéndote solo a la carpeta, lo que simplifica las rutas y desacopla a los consumidores de la estructura interna:&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;Hero&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Villain&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;./interfaces&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class="mermaid"&gt;flowchart LR
 H[hero.ts] --&gt; I[index.ts barrel]
 V[villain.ts] --&gt; I
 I --&gt; C[consumidor: import desde './interfaces']
&lt;/pre&gt;

&lt;h2 id="export-alias"&gt;Export alias&lt;/h2&gt;
&lt;p&gt;Un alias renombra un miembro al importarlo, lo que resuelve colisiones de nombres entre módulos distintos. Se usa la palabra clave &lt;code&gt;as&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;powers&lt;/span&gt; &lt;span style="color:#c678dd"&gt;as&lt;/span&gt; &lt;span style="color:#e06c75"&gt;poderes&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;./data/powers&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;poderes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="export-default"&gt;Export default&lt;/h2&gt;
&lt;p&gt;Una exportación por defecto designa el valor principal de un módulo. Se importa sin llaves y puede combinarse con importaciones nombradas en la misma línea:&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:#7f848e"&gt;// data/powers.ts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;default&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Powers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;fuerza&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;velocidad&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;Powers&lt;/span&gt;, { &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt; &lt;span style="color:#c678dd"&gt;as&lt;/span&gt; &lt;span style="color:#e06c75"&gt;poderes&lt;/span&gt; } &lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;./data/powers&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Powers&lt;/code&gt; corresponde a la exportación por defecto y &lt;code&gt;poderes&lt;/code&gt; a una exportación nombrada renombrada con alias.&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;Prefiere las exportaciones nombradas frente a &lt;code&gt;export default&lt;/code&gt; en bases de código grandes: facilitan el &lt;em&gt;autocompletado&lt;/em&gt;, el &lt;em&gt;refactoring&lt;/em&gt; automático y mantienen nombres consistentes entre el módulo y sus consumidores.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="del-código-a-un-bundle"&gt;Del código a un bundle&lt;/h2&gt;
&lt;p&gt;Los módulos resuelven la organización en tiempo de desarrollo, pero el navegador necesita servir el resultado de forma eficiente. Empaquetadores como &lt;strong&gt;webpack&lt;/strong&gt; combinan todos los módulos en uno o pocos archivos optimizados, resolviendo el grafo de dependencias que tejen tus &lt;code&gt;import&lt;/code&gt;. TypeScript se integra en este flujo transpilando primero a JavaScript y dejando que el bundler se encargue del empaquetado final.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Estructurar el código es una decisión de arquitectura. Los namespaces agrupan elementos internos y persisten en definiciones de tipos, pero el estándar moderno son los módulos ES con &lt;code&gt;export&lt;/code&gt;/&lt;code&gt;import&lt;/code&gt;. Los archivos &lt;em&gt;barrel&lt;/em&gt; centralizan las exportaciones, los alias resuelven colisiones de nombres y &lt;code&gt;export default&lt;/code&gt; designa el valor principal de un módulo.&lt;/p&gt;
&lt;p&gt;En el artículo final de la serie consolidaremos la configuración del compilador y la &lt;strong&gt;depuración de errores&lt;/strong&gt; mediante &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Decoradores y metaprogramación</title><link>https://blog.dacadev.com/programacion/typescript/decoradores/</link><pubDate>Mon, 22 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/decoradores/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a usar decoradores en TypeScript: decoradores de clase, de fábrica, de método y de propiedad para extender comportamiento con metaprogramación.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/decorators/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="#decoradores-de-clase"&gt;Decoradores de clase&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#decoradores-de-fábrica"&gt;Decoradores de fábrica&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#decoradores-de-método"&gt;Decoradores de método&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#decoradores-de-propiedad"&gt;Decoradores de propiedad&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;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;Noveno artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Estudiaremos los decoradores: funciones que se ejecutan en la definición de clases, métodos y propiedades para extender su comportamiento sin modificar su código original.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un &lt;strong&gt;decorador en TypeScript&lt;/strong&gt; es una función que se ejecuta en tiempo de transpilación y permite expandir la funcionalidad de un objeto —clase, método o propiedad— de forma declarativa. Frameworks como Angular o NestJS apoyan gran parte de su ergonomía en este mecanismo. Analicemos cada variante con ejemplos prácticos. Puedes consultar la referencia completa en la &lt;a href="https://www.typescriptlang.org/docs/handbook/decorators.html"




 target="_blank"
 


&gt;documentación oficial de decoradores&lt;/a&gt;.&lt;/p&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;Los decoradores se colocan con la sintaxis &lt;code&gt;@nombre&lt;/code&gt; justo antes del elemento a decorar. Por convención se declaran con &lt;code&gt;function&lt;/code&gt; —en lugar de arrow functions— para distinguirlos visualmente de las funciones ordinarias.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="decoradores-de-clase"&gt;Decoradores de clase&lt;/h2&gt;
&lt;p&gt;Un decorador de clase recibe el constructor y se ejecuta &lt;strong&gt;una sola vez&lt;/strong&gt;, en el momento en que se define la clase —no al crear cada instancia:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;printToConsole&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Function&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:#c678dd"&gt;constructor&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;@printToConsole&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pokemon&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;publicApi&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;https://pokeapi.co&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;constructor&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al crear varias instancias, el decorador no vuelve a ejecutarse: su efecto ocurre en la definición, no en la instanciación.&lt;/p&gt;
&lt;h2 id="decoradores-de-fábrica"&gt;Decoradores de fábrica&lt;/h2&gt;
&lt;p&gt;Un decorador de fábrica es una función que &lt;strong&gt;retorna&lt;/strong&gt; el decorador real. Esto permite parametrizar el comportamiento, aceptando argumentos que controlan cómo se aplica:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;printToConsole&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Function&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:#c678dd"&gt;constructor&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;printToConsoleConditional&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;print&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Function&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;print&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;?&lt;/span&gt; &lt;span style="color:#e06c75"&gt;printToConsole&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&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;@printToConsoleConditional&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pokemon&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;publicApi&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;https://pokeapi.co&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;constructor&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un patrón habitual es sellar el prototipo para impedir que se alteren sus propiedades en tiempo de ejecució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;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;blockPrototype&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;function&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Function&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;Object&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;seal&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;Object&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;seal&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;prototype&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;@blockPrototype&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;@printToConsoleConditional&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pokemon&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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;/code&gt;&lt;/pre&gt;&lt;/div&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;Cuando aplicas múltiples decoradores, se ejecutan de forma secuencial &lt;strong&gt;de abajo hacia arriba&lt;/strong&gt;. En el ejemplo anterior, primero corre &lt;code&gt;printToConsoleConditional&lt;/code&gt; y luego &lt;code&gt;blockPrototype&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="decoradores-de-método"&gt;Decoradores de método&lt;/h2&gt;
&lt;p&gt;Un decorador de método recibe tres argumentos —el objeto al que pertenece, el nombre del método y su &lt;code&gt;PropertyDescriptor&lt;/code&gt;— y puede inspeccionar o &lt;strong&gt;reemplazar&lt;/strong&gt; por completo el comportamiento del método. Aquí lo usamos para validar argumentos:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CheckValidPokemonId() {&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:#c678dd"&gt;function&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;target&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;any&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;propertyKey&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 style="color:#e06c75"&gt;descriptor&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;PropertyDescriptor&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;originalMethod&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;descriptor&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:#e06c75"&gt;descriptor&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:#e06c75"&gt;id&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;if&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;||&lt;/span&gt; &lt;span style="color:#e06c75"&gt;id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;error&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;El id del pokemon debe estar entre 1 y 100&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;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;originalMethod&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;id&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&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;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pokemon&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;publicApi&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;https://pokeapi.co&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;constructor&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;@CheckValidPokemonId&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;savePokemonToDB&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&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;`Pokemon guardado en la base de datos &lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#e06c75"&gt;id&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al envolver &lt;code&gt;originalMethod&lt;/code&gt;, el decorador intercepta la llamada, valida el &lt;code&gt;id&lt;/code&gt; y solo delega al método original cuando el valor es válido. Este es el fundamento de las validaciones declarativas de muchos frameworks.&lt;/p&gt;
&lt;h2 id="decoradores-de-propiedad"&gt;Decoradores de propiedad&lt;/h2&gt;
&lt;p&gt;Un decorador de propiedad recibe el objeto y el nombre de la propiedad, y puede alterar cómo se lee y escribe. Es útil para controlar el acceso a datos —recordando que JavaScript no tiene propiedades verdaderamente privadas en runtime:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;readOnly&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;isWriteable&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Function&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:#c678dd"&gt;function&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;target&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;any&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;propertyKey&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 style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;descriptor&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;PropertyDescriptor&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:#c678dd"&gt;get&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:#98c379"&gt;&amp;#39;Daca code&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;set&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;val&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;Object&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;defineProperty&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;propertyKey&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;val&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;writable&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e06c75"&gt;isWriteable&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;enumerable&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;false&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&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;descriptor&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pokemon&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;@readOnly&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;publicApi&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;https://pokeapi.co&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;constructor&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El decorador define un &lt;code&gt;get&lt;/code&gt;/&lt;code&gt;set&lt;/code&gt; personalizado que gobierna por completo el acceso a &lt;code&gt;publicApi&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los decoradores aportan metaprogramación declarativa a TypeScript: el decorador de clase actúa sobre el constructor una única vez, el de fábrica parametriza el comportamiento, el de método intercepta y reemplaza llamadas, y el de propiedad controla la lectura y escritura. Componerlos en cadena —respetando su orden de ejecución— es lo que habilita las APIs elegantes de frameworks modernos.&lt;/p&gt;
&lt;p&gt;En el próximo artículo organizaremos el código con &lt;strong&gt;namespaces y módulos&lt;/strong&gt;: &lt;code&gt;export&lt;/code&gt;, &lt;code&gt;import&lt;/code&gt;, alias y exportaciones por defecto.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Tipos avanzados, subtipos y varianza</title><link>https://blog.dacadev.com/programacion/typescript/tipos-avanzados/</link><pubDate>Sun, 21 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/tipos-avanzados/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Comprende la jerarquía de tipos de TypeScript: subtipos y supertipos, los tipos top y bottom (unknown y never), null, undefined, void y la varianza.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/advanced-types/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="#subtipos"&gt;Subtipos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#supertipos"&gt;Supertipos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-jerarquía-de-tipos"&gt;La jerarquía de tipos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#los-tipos-especiales-null-undefined-void-y-never"&gt;Los tipos especiales: null, undefined, void y never&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#varianza"&gt;Varianza&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;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;Octavo artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Abordaremos la teoría que sustenta el sistema de tipos: subtipos, supertipos, la jerarquía completa, los tipos &lt;code&gt;unknown&lt;/code&gt; y &lt;code&gt;never&lt;/code&gt;, y la varianza.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Comprender la &lt;strong&gt;relación entre tipos&lt;/strong&gt; es lo que separa a quien usa TypeScript de quien lo domina. El compilador decide qué asignaciones son válidas aplicando reglas de subtipado y varianza. Una vez interiorizadas estas reglas, los errores del typechecker dejan de ser obstáculos crípticos y se convierten en información precisa sobre el diseño de tus tipos.&lt;/p&gt;
&lt;h2 id="subtipos"&gt;Subtipos&lt;/h2&gt;
&lt;p&gt;La regla fundamental del subtipado se enuncia así:&lt;/p&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;Si tienes un tipo &lt;code&gt;A&lt;/code&gt; y un tipo &lt;code&gt;B&lt;/code&gt; donde &lt;code&gt;B&lt;/code&gt; es &lt;strong&gt;subtipo&lt;/strong&gt; de &lt;code&gt;A&lt;/code&gt;, entonces puedes usar &lt;code&gt;B&lt;/code&gt; en cualquier lugar donde se espere un &lt;code&gt;A&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Algunas relaciones de subtipo en TypeScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Array&lt;/code&gt; es subtipo de &lt;code&gt;Object&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tuple&lt;/code&gt; es subtipo de &lt;code&gt;Array&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Todo es subtipo de &lt;code&gt;any&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;never&lt;/code&gt; es subtipo de todo.&lt;/li&gt;
&lt;li&gt;Si una clase &lt;code&gt;Bird&lt;/code&gt; extiende &lt;code&gt;Animal&lt;/code&gt;, entonces &lt;code&gt;Bird&lt;/code&gt; es subtipo de &lt;code&gt;Animal&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aplicado a la práctica, esto significa que donde se necesite un &lt;code&gt;Object&lt;/code&gt; puedes usar un &lt;code&gt;Array&lt;/code&gt;; donde se necesite un &lt;code&gt;Array&lt;/code&gt; puedes usar una &lt;code&gt;Tuple&lt;/code&gt;; y donde se necesite un &lt;code&gt;Animal&lt;/code&gt; puedes usar un &lt;code&gt;Bird&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="supertipos"&gt;Supertipos&lt;/h2&gt;
&lt;p&gt;Un supertipo es la relación inversa:&lt;/p&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;Si tienes un tipo &lt;code&gt;A&lt;/code&gt; y un tipo &lt;code&gt;B&lt;/code&gt; donde &lt;code&gt;B&lt;/code&gt; es &lt;strong&gt;supertipo&lt;/strong&gt; de &lt;code&gt;A&lt;/code&gt;, entonces puedes usar &lt;code&gt;A&lt;/code&gt; en cualquier lugar donde se espere un &lt;code&gt;B&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las relaciones de supertipo reflejan en espejo a las anteriores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Array&lt;/code&gt; es supertipo de &lt;code&gt;Tuple&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object&lt;/code&gt; es supertipo de &lt;code&gt;Array&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;any&lt;/code&gt; es supertipo de todo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Animal&lt;/code&gt; es supertipo de &lt;code&gt;Bird&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-jerarquía-de-tipos"&gt;La jerarquía de tipos&lt;/h2&gt;
&lt;p&gt;Todas estas relaciones forman una jerarquía con un tipo en la cúspide (&lt;em&gt;top type&lt;/em&gt;) y otro en el fondo (&lt;em&gt;bottom type&lt;/em&gt;):&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Unknown[unknown - top type] --&gt; Any[any]
 Any --&gt; Number
 Any --&gt; BigInt
 Any --&gt; Boolean
 Any --&gt; String
 Any --&gt; Symbol
 Any --&gt; Object
 Any --&gt; Void
 Any --&gt; Null
 Any --&gt; Undefined
 Object --&gt; Array
 Array --&gt; Tuple
 Object --&gt; Function
 Number --&gt; Never[never - bottom type]
 String --&gt; Never
 Boolean --&gt; Never
 Object --&gt; Never
 Tuple --&gt; Never
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;unknown&lt;/code&gt;&lt;/strong&gt; es el &lt;em&gt;top type&lt;/em&gt;: todo es asignable a él, pero no permite operar sin acotar primero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;never&lt;/code&gt;&lt;/strong&gt; es el &lt;em&gt;bottom type&lt;/em&gt;: es subtipo de cualquier otro tipo y representa lo que nunca ocurre.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="los-tipos-especiales-null-undefined-void-y-never"&gt;Los tipos especiales: null, undefined, void y never&lt;/h2&gt;
&lt;p&gt;Estos cuatro tipos modelan la ausencia de valor con matices distintos:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tipo&lt;/th&gt;
 &lt;th&gt;Significado&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Ausencia explícita de valor&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Variable que aún no recibió un valor&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Función que no tiene sentencia &lt;code&gt;return&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;never&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Función que nunca retorna&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La distinción entre &lt;code&gt;void&lt;/code&gt; y &lt;code&gt;never&lt;/code&gt; es sutil pero importante. Una función &lt;code&gt;void&lt;/code&gt; termina sin devolver nada útil; una función &lt;code&gt;never&lt;/code&gt; no termina en absoluto, ya sea porque lanza una excepción o porque entra en un bucle infinito:&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:#7f848e"&gt;// void: termina, no retorna valor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&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:#e06c75"&gt;msg&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:#7f848e"&gt;// never: nunca completa su ejecución
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fail&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;message&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;never&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;throw&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Error&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;message&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;loopForever&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;never&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;while&lt;/span&gt; (&lt;span style="color:#e5c07b"&gt;true&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;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;&lt;code&gt;never&lt;/code&gt; es especialmente útil en la verificación de exhaustividad: si un &lt;code&gt;switch&lt;/code&gt; cubre todos los casos de una unión, la rama &lt;code&gt;default&lt;/code&gt; puede asignar el valor a un &lt;code&gt;never&lt;/code&gt;, y el compilador detectará en tiempo de compilación cualquier caso olvidado al ampliar la unión.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="varianza"&gt;Varianza&lt;/h2&gt;
&lt;p&gt;Determinar si un tipo es sub o supertipo de otro no siempre es evidente, sobre todo al combinar estructuras y funciones. TypeScript dispone de una notación formal para razonar sobre estas relaciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;A &amp;lt;: B&lt;/code&gt; significa &amp;ldquo;&lt;code&gt;A&lt;/code&gt; es subtipo de, o el mismo tipo que, &lt;code&gt;B&lt;/code&gt;&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;A &amp;gt;: B&lt;/code&gt; significa &amp;ldquo;&lt;code&gt;A&lt;/code&gt; es supertipo de, o el mismo tipo que, &lt;code&gt;B&lt;/code&gt;&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La &lt;strong&gt;varianza&lt;/strong&gt; describe cómo se propagan estas relaciones cuando los tipos se anidan en estructuras (arreglos, objetos) o en firmas de función. Es el motivo por el que, por ejemplo, un arreglo de un subtipo no siempre es intercambiable con un arreglo de su supertipo: la mutabilidad introduce restricciones que el compilador debe respetar para mantener la solidez del sistema.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El sistema de tipos de TypeScript es una jerarquía gobernada por reglas de subtipado y varianza, con &lt;code&gt;unknown&lt;/code&gt; como tipo superior y &lt;code&gt;never&lt;/code&gt; como tipo inferior. Distinguir &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;void&lt;/code&gt; y &lt;code&gt;never&lt;/code&gt;, y comprender cómo &lt;code&gt;B &amp;lt;: A&lt;/code&gt; permite sustituir un tipo por otro, te da una intuición precisa de por qué el compilador acepta o rechaza una asignación.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo aplicaremos metaprogramación con &lt;strong&gt;decoradores&lt;/strong&gt;, funciones que extienden el comportamiento de clases, métodos y propiedades.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Genéricos y código reutilizable</title><link>https://blog.dacadev.com/programacion/typescript/genericos/</link><pubDate>Sat, 20 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/genericos/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a usar genéricos en TypeScript para escribir funciones y clases reutilizables que preservan la seguridad de tipos con parámetros de tipo dinámicos.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/generics/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="#funciones-genéricas"&gt;Funciones genéricas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#por-qué-no-basta-con-any"&gt;Por qué no basta con any&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#clases-genéricas"&gt;Clases genéricas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#restringir-genéricos-con-extends"&gt;Restringir genéricos con extends&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;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;Séptimo artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Exploraremos los genéricos: funciones y clases que operan sobre tipos dinámicos sin renunciar a la verificación estática.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Los &lt;strong&gt;genéricos en TypeScript&lt;/strong&gt; resuelven una tensión recurrente: escribir código reutilizable que funcione con cualquier tipo, pero sin caer en &lt;code&gt;any&lt;/code&gt; y perder toda la seguridad. Un genérico introduce un &lt;em&gt;parámetro de tipo&lt;/em&gt; —una variable que representa un tipo aún por determinar— que se resuelve en el momento de uso. Analicemos cómo aplicarlos.&lt;/p&gt;
&lt;h2 id="funciones-genéricas"&gt;Funciones genéricas&lt;/h2&gt;
&lt;p&gt;Una función genérica declara su parámetro de tipo con la sintaxis &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; antes de la lista de parámetros. &lt;code&gt;T&lt;/code&gt; representa el tipo que recibirá, y la función puede usarlo para tipar argumentos y retorno:&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:#7f848e"&gt;// Función tradicional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;genericFunction&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;argumento&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;T&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;argumento&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:#7f848e"&gt;// Arrow function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;export&lt;/span&gt; &lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;genericArrowFunction&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;argumento&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;T&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;argumento&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La función anterior retorna exactamente el mismo tipo que recibe. Si la invocas con un &lt;code&gt;string&lt;/code&gt;, TypeScript sabe que el retorno es &lt;code&gt;string&lt;/code&gt;; si la invocas con un &lt;code&gt;number&lt;/code&gt;, el retorno es &lt;code&gt;number&lt;/code&gt;. Esto es lo que distingue a un genérico de &lt;code&gt;any&lt;/code&gt;: &lt;strong&gt;la relación entre entrada y salida se preserva&lt;/strong&gt;.&lt;/p&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;T&lt;/code&gt; es el nombre convencional, pero es arbitrario. Para múltiples parámetros suelen usarse &lt;code&gt;T&lt;/code&gt;, &lt;code&gt;U&lt;/code&gt;, &lt;code&gt;K&lt;/code&gt;, &lt;code&gt;V&lt;/code&gt;, o nombres descriptivos como &lt;code&gt;TItem&lt;/code&gt; cuando aportan claridad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="por-qué-no-basta-con-any"&gt;Por qué no basta con any&lt;/h2&gt;
&lt;p&gt;Comparemos las dos aproximaciones para entender el valor de los genéricos:&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:#7f848e"&gt;// Con any: se pierde la información de tipo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;identityAny&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arg&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;any&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;any&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;arg&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;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;identityAny&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;hola&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// a es any → sin autocompletado ni verificación
&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:#7f848e"&gt;// Con genéricos: el tipo se conserva
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;identity&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;arg&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;T&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;arg&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;b&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;identity&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;hola&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// b es string → seguridad completa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con &lt;code&gt;any&lt;/code&gt;, el resultado pierde todo su tipo y el typechecker deja de ayudar. Con un genérico, la firma encadena el tipo de entrada con el de salida.&lt;/p&gt;
&lt;h2 id="clases-genéricas"&gt;Clases genéricas&lt;/h2&gt;
&lt;p&gt;Las clases también admiten parámetros de tipo, lo que permite construir estructuras de datos reutilizables y type-safe. El parámetro se declara junto al nombre de la clase y queda disponible en todos sus miembros:&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MyMap&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;K&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;V&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;initialKey&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;K&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;initialValue&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;V&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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;get&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;key&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;K&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;V&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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;set&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;key&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;K&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;V&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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;static&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;K&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;V&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;k&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;K&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;v&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;V&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MyMap&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;K&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;V&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al instanciarla, los tipos pueden indicarse explícitamente o inferirse de los argumentos:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MyMap&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;number&lt;/span&gt;&amp;gt;(&lt;span style="color:#98c379"&gt;&amp;#39;k&amp;#39;&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// MyMap&amp;lt;string, number&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;MyMap&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;k&amp;#39;&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// MyMap&amp;lt;string, boolean&amp;gt; (inferido)
&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;a&lt;/span&gt;.&lt;span style="color:#c678dd"&gt;get&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;k&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;b&lt;/span&gt;.&lt;span style="color:#c678dd"&gt;set&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;k&amp;#39;&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class="mermaid"&gt;flowchart LR
 G["MyMap&amp;lt;K, V&amp;gt;"] --&gt; A["MyMap&amp;lt;string, number&amp;gt;"]
 G --&gt; B["MyMap&amp;lt;string, boolean&amp;gt;"]
 G --&gt; C["MyMap&amp;lt;number, Hero&amp;gt;"]
&lt;/pre&gt;

&lt;p&gt;Una sola definición genérica genera tantas variantes type-safe como combinaciones de tipos uses.&lt;/p&gt;
&lt;h2 id="restringir-genéricos-con-extends"&gt;Restringir genéricos con extends&lt;/h2&gt;
&lt;p&gt;A veces un genérico no debe aceptar cualquier tipo, sino solo aquellos que cumplan cierta forma. La cláusula &lt;code&gt;extends&lt;/code&gt; impone esa restricción y, a la vez, habilita el acceso seguro a los miembros garantizados:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;getLength&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt; &lt;span style="color:#e06c75"&gt;extends&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;length&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; }&amp;gt;(&lt;span style="color:#e06c75"&gt;item&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;item&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;length&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;getLength&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;hola&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// OK: string tiene length
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;getLength&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:#7f848e"&gt;// OK: array tiene length
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;getLength&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;42&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// Error: number no tiene &amp;#39;length&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;T extends { length: number }&lt;/code&gt; restringe &lt;code&gt;T&lt;/code&gt; a tipos que posean una propiedad &lt;code&gt;length&lt;/code&gt;, permitiendo usarla con seguridad dentro de la función.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los genéricos son la herramienta que permite escribir código verdaderamente reutilizable sin sacrificar la verificación de tipos. Las funciones genéricas encadenan el tipo de entrada con el de salida, las clases genéricas habilitan estructuras de datos type-safe, y las restricciones con &lt;code&gt;extends&lt;/code&gt; acotan los tipos aceptados mientras exponen sus miembros de forma segura.&lt;/p&gt;
&lt;p&gt;En el próximo artículo abordaremos los &lt;strong&gt;tipos avanzados&lt;/strong&gt;: subtipos, supertipos, varianza y la jerarquía completa del sistema de tipos.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Clases, herencia y patrones de diseño</title><link>https://blog.dacadev.com/programacion/typescript/clases-e-interfaces/</link><pubDate>Fri, 19 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/clases-e-interfaces/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las clases en TypeScript: herencia, modificadores public/protected/private, clases abstractas, getters/setters, estáticos y patrones Factory y Builder.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/classes-inheritance/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="#clases-y-herencia"&gt;Clases y herencia&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#modificadores-de-acceso"&gt;Modificadores de acceso&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#clases-abstractas"&gt;Clases abstractas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#super-invocar-a-la-clase-padre"&gt;super: invocar a la clase padre&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#getters-y-setters"&gt;Getters y setters&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#miembros-estáticos"&gt;Miembros estáticos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#this-como-tipo-de-retorno"&gt;this como tipo de retorno&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tipado-estructural"&gt;Tipado estructural&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#constructor-privado"&gt;Constructor privado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#patrones-de-diseño-habilitados"&gt;Patrones de diseño habilitados&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#factory-pattern"&gt;Factory Pattern&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#builder-pattern"&gt;Builder Pattern&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&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;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;Sexto artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Recorreremos las clases: herencia, modificadores de acceso, clases abstractas, &lt;code&gt;super&lt;/code&gt;, getters/setters, miembros estáticos, tipado estructural y los patrones de diseño que habilitan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las &lt;strong&gt;clases en TypeScript&lt;/strong&gt; parten de la sintaxis de JavaScript y la enriquecen con modificadores de acceso, clases abstractas y tipado estructural. El resultado es un modelo de orientación a objetos cercano al de lenguajes como C++ o Java, pero que compila a JavaScript estándar. Analicemos sus capacidades.&lt;/p&gt;
&lt;h2 id="clases-y-herencia"&gt;Clases y herencia&lt;/h2&gt;
&lt;p&gt;La declaración usa &lt;code&gt;class&lt;/code&gt; y la herencia se establece con &lt;code&gt;extends&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Piece&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;King&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Piece&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Queen&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Piece&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Bishop&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Piece&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos restringir los atributos a valores concretos combinando clases con tipos literales:&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Color&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Black&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;White&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;File&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;A&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;B&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;C&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;D&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;E&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;F&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;G&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;H&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Rank&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:#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;3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;7&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#d19a66"&gt;8&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Position&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;file&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;File&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;rank&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Rank&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Declarar los parámetros del constructor con un modificador (&lt;code&gt;private file: File&lt;/code&gt;) es un atajo: TypeScript crea y asigna la propiedad automáticamente, evitando el habitual &lt;code&gt;this.file = file&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="modificadores-de-acceso"&gt;Modificadores de acceso&lt;/h2&gt;
&lt;p&gt;TypeScript define tres niveles de visibilidad para atributos y métodos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;public&lt;/code&gt;: accesible desde cualquier lugar. Es el nivel por defecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;protected&lt;/code&gt;: accesible desde la propia clase y sus subclases.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;private&lt;/code&gt;: accesible únicamente desde la propia clase.&lt;/li&gt;
&lt;/ul&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenger&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;team&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 style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;realName?&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;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;bio() {&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:#98c379"&gt;`&lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt; &lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;team&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;bioInterno() {&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:#98c379"&gt;`&lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;realName&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt; &lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;team&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;private&lt;/code&gt; y &lt;code&gt;protected&lt;/code&gt; solo aplican en tiempo de compilación. El JavaScript emitido no impide el acceso en runtime; para privacidad real en ejecución usa los campos privados nativos de JavaScript (&lt;code&gt;#campo&lt;/code&gt;).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="clases-abstractas"&gt;Clases abstractas&lt;/h2&gt;
&lt;p&gt;Una clase &lt;code&gt;abstract&lt;/code&gt; define una plantilla que no puede instanciarse, pero sirve de esqueleto para sus subclases. Puede declarar miembros concretos y miembros &lt;code&gt;abstract&lt;/code&gt; que las subclases están obligadas a implementar:&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;abstract&lt;/span&gt; &lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Mutante&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;realName&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Mutante&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;saveWorld() {&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:#98c379"&gt;&amp;#39;Mundo salvado&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Villano&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Mutante&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;conquistWorld() {&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:#98c379"&gt;&amp;#39;Mundo conquistado&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&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;wolverine&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Wolverine&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;Logan&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;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;magneto&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Villano&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Magneto&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;Magnus&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una ventaja adicional: una función puede aceptar cualquier objeto que herede de la clase abstracta, lo que habilita el polimorfismo:&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;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;printName&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;character&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Mutante&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:#e06c75"&gt;character&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&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;printName&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;wolverine&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;printName&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;magneto&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="super-invocar-a-la-clase-padre"&gt;super: invocar a la clase padre&lt;/h2&gt;
&lt;p&gt;Cuando una subclase sobrescribe un método del padre, puede invocar la versión original con &lt;code&gt;super.metodo()&lt;/code&gt;. Si la subclase define un constructor, &lt;strong&gt;debe&lt;/strong&gt; llamar a &lt;code&gt;super()&lt;/code&gt; para inicializar correctamente la cadena de herencia:&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenger&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;realName&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;isMutant&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;super&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;realName&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;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;getFullNameDesdeXmen() {&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:#c678dd"&gt;super&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;getFullName&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="getters-y-setters"&gt;Getters y setters&lt;/h2&gt;
&lt;p&gt;Los &lt;em&gt;accessors&lt;/em&gt; exponen métodos que se comportan sintácticamente como atributos, facilitando la lectura y asignación controladas:&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenger&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;get&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fullName() {&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:#98c379"&gt;`&lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt; - &lt;/span&gt;&lt;span style="color:#98c379"&gt;${&lt;/span&gt;&lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;realName&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;set&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fullName&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;realName&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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&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;wolverine&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Wolverine&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;Logan&amp;#39;&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;true&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:#e06c75"&gt;wolverine&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;fullName&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// se lee como atributo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;wolverine&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;fullName&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;David&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// se asigna como atributo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="miembros-estáticos"&gt;Miembros estáticos&lt;/h2&gt;
&lt;p&gt;Los miembros &lt;code&gt;static&lt;/code&gt; pertenecen a la clase, no a sus instancias:&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenger&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;static&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avgAge&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;static&lt;/span&gt; &lt;span style="color:#e06c75"&gt;getAvgAge() {&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;Avenger&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;avgAge&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&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:#e06c75"&gt;Avenger&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;avgAge&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// se accede vía la clase
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="this-como-tipo-de-retorno"&gt;this como tipo de retorno&lt;/h2&gt;
&lt;p&gt;Cuando un método retorna la propia instancia, su tipo de retorno es &lt;code&gt;this&lt;/code&gt;. Esto es la base del encadenamiento de métodos (&lt;em&gt;method chaining&lt;/em&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Set&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;add&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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:#c678dd"&gt;this&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tipado-estructural"&gt;Tipado estructural&lt;/h2&gt;
&lt;p&gt;TypeScript verifica las clases por &lt;strong&gt;estructura&lt;/strong&gt;, no por nombre. Dos tipos compatibles en forma son intercambiables, con una salvedad: los miembros &lt;code&gt;private&lt;/code&gt; rompen la compatibilidad estructural:&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;x&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 style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;B&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;A&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;f&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&lt;/span&gt;()) &lt;span style="color:#7f848e"&gt;// OK
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;f&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;B&lt;/span&gt;()) &lt;span style="color:#7f848e"&gt;// OK
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;f&lt;/span&gt;({ &lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;1&lt;/span&gt; }) &lt;span style="color:#7f848e"&gt;// Error TS2345: &amp;#39;x&amp;#39; es private en &amp;#39;A&amp;#39; pero no en &amp;#39;{x: number}&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="constructor-privado"&gt;Constructor privado&lt;/h2&gt;
&lt;p&gt;Un constructor &lt;code&gt;private&lt;/code&gt; impide instanciar la clase desde fuera, lo que permite controlar su creación. Es la base del patrón &lt;em&gt;singleton&lt;/em&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#c678dd"&gt;static&lt;/span&gt; &lt;span style="color:#e06c75"&gt;instance&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Apocalipsis&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;private&lt;/span&gt; &lt;span style="color:#c678dd"&gt;constructor&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;static&lt;/span&gt; &lt;span style="color:#e06c75"&gt;getInstance&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;instance&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;instance&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Soy Apocalipsis... el único&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;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;instance&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&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;apocalipsis&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Apocalipsis&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;getInstance&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="patrones-de-diseño-habilitados"&gt;Patrones de diseño habilitados&lt;/h2&gt;
&lt;h3 id="factory-pattern"&gt;Factory Pattern&lt;/h3&gt;
&lt;p&gt;Centraliza la creación de objetos detrás de una función que decide la clase concreta:&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Shoe&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;purpose&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 style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BalletFlat&lt;/span&gt; &lt;span style="color:#c678dd"&gt;implements&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Shoe&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;purpose&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;dancing&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Boot&lt;/span&gt; &lt;span style="color:#c678dd"&gt;implements&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Shoe&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;purpose&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;woodcutting&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Sneaker&lt;/span&gt; &lt;span style="color:#c678dd"&gt;implements&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Shoe&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;purpose&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;walking&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Shoe&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;create&lt;/span&gt;(&lt;span style="color:#c678dd"&gt;type&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;balletFlat&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;boot&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;sneaker&amp;#39;&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Shoe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;switch&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;type&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;case&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;balletFlat&amp;#39;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;BalletFlat&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;case&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;boot&amp;#39;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Boot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;case&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;sneaker&amp;#39;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Sneaker&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="builder-pattern"&gt;Builder Pattern&lt;/h3&gt;
&lt;p&gt;Construye un objeto paso a paso mediante métodos que retornan &lt;code&gt;this&lt;/code&gt;, habilitando una API fluida:&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RequestBuilder&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;data&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;object&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;method&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;get&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;post&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;private&lt;/span&gt; &lt;span style="color:#e06c75"&gt;url&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&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;setMethod&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;method&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;get&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;method&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;method&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:#c678dd"&gt;this&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;setData&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;data&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;object&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;data&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;data&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:#c678dd"&gt;this&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;setURL&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;url&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;url&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;url&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:#c678dd"&gt;this&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;send() {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&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&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;new&lt;/span&gt; &lt;span style="color:#e06c75"&gt;RequestBuilder&lt;/span&gt;().&lt;span style="color:#e06c75"&gt;setURL&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;/api&amp;#39;&lt;/span&gt;).&lt;span style="color:#e06c75"&gt;setMethod&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;).&lt;span style="color:#e06c75"&gt;setData&lt;/span&gt;({}).&lt;span style="color:#e06c75"&gt;send&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las clases de TypeScript ofrecen un modelo de orientación a objetos completo: herencia, modificadores de acceso, clases abstractas para polimorfismo, accessors, miembros estáticos y un tipado estructural con la salvedad de los miembros privados. Estas piezas son el fundamento de patrones de diseño como Factory, Builder y Singleton.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo abordaremos los &lt;strong&gt;genéricos&lt;/strong&gt;, la herramienta para escribir código reutilizable sin sacrificar la seguridad de tipos.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Animaciones con @keyframes</title><link>https://blog.dacadev.com/programacion/estilos-css/animaciones-keyframes/</link><pubDate>Thu, 18 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/animaciones-keyframes/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las animaciones en CSS con @keyframes: la propiedad animation, iteraciones, direction, fill-mode, play-state, accesibilidad y rendimiento, con ejemplos en vivo.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/09-animaciones-keyframes-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="#transición-vs-animación"&gt;Transición vs. animación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-regla-keyframes"&gt;La regla @keyframes&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#múltiples-pasos-con-porcentajes"&gt;Múltiples pasos con porcentajes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-propiedad-animation-y-sus-subpropiedades"&gt;La propiedad animation y sus subpropiedades&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#iteration-count-y-direction"&gt;iteration-count y direction&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fill-mode-el-estado-antes-y-después"&gt;fill-mode: el estado antes y después&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#play-state-y-delay"&gt;play-state y delay&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#encadenar-varias-animaciones"&gt;Encadenar varias animaciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#accesibilidad-respeta-prefers-reduced-motion"&gt;Accesibilidad: respeta prefers-reduced-motion&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendimiento-anima-en-la-capa-de-composición"&gt;Rendimiento: anima en la capa de composición&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;Una transición anima el salto entre dos estados; pero cuando necesitas movimiento continuo, varios pasos intermedios o una secuencia que se repite —un spinner de carga, un latido, un texto que aparece— necesitas algo más expresivo. Ahí entran las &lt;strong&gt;animaciones con &lt;code&gt;@keyframes&lt;/code&gt;&lt;/strong&gt;, el sistema de CSS para describir secuencias de movimiento complejas de forma declarativa, sin una sola línea de JavaScript.&lt;/p&gt;
&lt;p&gt;Esta entrega extiende la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;, retomando justo donde lo dejaron las transiciones y transformaciones. Cubriremos la regla &lt;code&gt;@keyframes&lt;/code&gt;, todas las subpropiedades de &lt;code&gt;animation&lt;/code&gt;, y las consideraciones de accesibilidad y rendimiento que separan una animación profesional de una que marea al usuario.&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;Aprenderás a definir secuencias con &lt;code&gt;@keyframes&lt;/code&gt;, a controlarlas con la propiedad &lt;code&gt;animation&lt;/code&gt; y sus ocho subpropiedades, y a respetar las preferencias de movimiento del usuario con &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transición-vs-animación"&gt;Transición vs. animación&lt;/h2&gt;
&lt;p&gt;Aunque ambas producen movimiento, resuelven problemas distintos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una &lt;strong&gt;transición&lt;/strong&gt; (&lt;code&gt;transition&lt;/code&gt;) interpola entre el estado actual y uno nuevo. Necesita un disparador —un &lt;code&gt;:hover&lt;/code&gt;, un cambio de clase— y va de un punto A a un punto B.&lt;/li&gt;
&lt;li&gt;Una &lt;strong&gt;animación&lt;/strong&gt; (&lt;code&gt;animation&lt;/code&gt;) ejecuta una secuencia definida en &lt;code&gt;@keyframes&lt;/code&gt;. No necesita disparador: puede arrancar sola, repetirse indefinidamente y pasar por múltiples estados intermedios.&lt;/li&gt;
&lt;/ul&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;Regla práctica: usa &lt;code&gt;transition&lt;/code&gt; para cambios de estado provocados por interacción; usa &lt;code&gt;animation&lt;/code&gt; para movimiento autónomo, cíclico o multipaso.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-regla-keyframes"&gt;La regla @keyframes&lt;/h2&gt;
&lt;p&gt;Una animación se define en dos partes: la &lt;strong&gt;secuencia&lt;/strong&gt; (con &lt;code&gt;@keyframes&lt;/code&gt;) y su &lt;strong&gt;aplicación&lt;/strong&gt; (con la propiedad &lt;code&gt;animation&lt;/code&gt;). La regla &lt;code&gt;@keyframes&lt;/code&gt; recibe un nombre y describe los estados de la animación en distintos momentos, expresados como porcentajes del 0% al 100% (o con las palabras clave &lt;code&gt;from&lt;/code&gt; y &lt;code&gt;to&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;from&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;opacity&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;opacity&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;elemento&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 @keyframes csanim-aparecer {
 from { opacity:0; transform:translateY(1rem); }
 to { opacity:1; transform:translateY(0); }
 }
 .csanim-fade { display:inline-block; background:#2a9da9; color:#fff; padding:.8em 1.4em; border-radius:.4em; animation:csanim-aparecer 1.2s ease-out infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-fade"&gt;Aparezco con fade + desplazamiento&lt;/span&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;La secuencia se repite para que puedas observarla.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="múltiples-pasos-con-porcentajes"&gt;Múltiples pasos con porcentajes&lt;/h3&gt;
&lt;p&gt;El verdadero poder de &lt;code&gt;@keyframes&lt;/code&gt; aparece con pasos intermedios. Cada porcentaje es una &amp;ldquo;foto&amp;rdquo; del estado en ese momento de la animació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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;latido&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&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 style="color:#e06c75"&gt;15&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.25&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;30&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&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 style="color:#e06c75"&gt;45&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.15&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;60&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-latido {
 0% { transform:scale(1); }
 15% { transform:scale(1.25); }
 30% { transform:scale(1); }
 45% { transform:scale(1.15); }
 60% { transform:scale(1); }
 100% { transform:scale(1); }
 }
 .csanim-heart { display:inline-block; font-size:2.5rem; color:#c0392b; animation:csanim-latido 1.5s ease-in-out infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-heart"&gt;♥&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="la-propiedad-animation-y-sus-subpropiedades"&gt;La propiedad animation y sus subpropiedades&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;animation&lt;/code&gt; es una propiedad abreviada que agrupa ocho subpropiedades. Conviene conocerlas por separado para tener control fino:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Subpropiedad&lt;/th&gt;
 &lt;th&gt;Función&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Nombre del &lt;code&gt;@keyframes&lt;/code&gt; a ejecutar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;aparecer&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-duration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Duración de un ciclo&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0.6s&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-timing-function&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Curva de progreso&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ease-in-out&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-delay&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Espera antes de iniciar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;200ms&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Número de repeticiones&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;infinite&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-direction&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sentido de reproducción&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;alternate&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-fill-mode&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Estilos antes/después de animar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;forwards&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-play-state&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Reproducir o pausar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;paused&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La forma abreviada las combina en una sola declaració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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;spinner&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;linear&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* name | duration | timing-function | iteration-count */&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;h3 id="iteration-count-y-direction"&gt;iteration-count y direction&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt; define cuántas veces se ejecuta (&lt;code&gt;infinite&lt;/code&gt; para un bucle perpetuo). &lt;code&gt;animation-direction&lt;/code&gt; controla el sentido:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;normal&lt;/code&gt; — siempre de 0% a 100%.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse&lt;/code&gt; — siempre de 100% a 0%.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate&lt;/code&gt; — alterna ida y vuelta en cada ciclo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate-reverse&lt;/code&gt; — igual, pero empezando al revés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El caso clásico es un &lt;strong&gt;spinner&lt;/strong&gt; de carga, que combina rotación infinita con velocidad constante:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;360&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&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:#e5c07b"&gt;spinner&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;linear&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-girar { to { transform:rotate(360deg); } }
 .csanim-spinner { display:inline-block; width:2.5rem; height:2.5rem; border:.3rem solid #d6eaf0; border-top-color:#2a9da9; border-radius:50%; animation:csanim-girar .8s linear infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-spinner" role="status" aria-label="Cargando"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="fill-mode-el-estado-antes-y-después"&gt;fill-mode: el estado antes y después&lt;/h3&gt;
&lt;p&gt;Por defecto, un elemento vuelve a su estilo original en cuanto la animación termina. &lt;code&gt;animation-fill-mode&lt;/code&gt; cambia ese comportamiento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt; (por defecto) — no conserva estilos fuera de la ejecución.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;forwards&lt;/code&gt; — mantiene el estado del último keyframe al terminar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backwards&lt;/code&gt; — aplica el primer keyframe durante el &lt;code&gt;delay&lt;/code&gt;, antes de arrancar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;both&lt;/code&gt; — combina &lt;code&gt;forwards&lt;/code&gt; y &lt;code&gt;backwards&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;forwards&lt;/code&gt; es esencial cuando quieres que el elemento permanezca en su estado final (por ejemplo, un mensaje que aparece y se queda visible):&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;toast&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;forwards&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;h3 id="play-state-y-delay"&gt;play-state y delay&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;animation-play-state&lt;/code&gt; permite pausar (&lt;code&gt;paused&lt;/code&gt;) y reanudar (&lt;code&gt;running&lt;/code&gt;) una animación, típicamente al combinarla con &lt;code&gt;:hover&lt;/code&gt;. Aquí, la barra de progreso se anima sola pero se congela al pasar el cursor:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cargar&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;from&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;width&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; } &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;width&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&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:#e5c07b"&gt;barra__relleno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;cargar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-in-out&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; .&lt;span style="color:#e5c07b"&gt;barra__relleno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation-play-state&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;paused&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 @keyframes csanim-cargar { 0% { width:0; } 100% { width:100%; } }
 .csanim-barra { background:#e5e8e8; border-radius:1rem; overflow:hidden; height:1rem; }
 .csanim-barra__relleno { height:100%; width:0; background:linear-gradient(to right,#2a9da9,#16828d); border-radius:1rem; animation:csanim-cargar 3s ease-in-out infinite; }
 .csanim-barra:hover .csanim-barra__relleno { animation-play-state:paused; }
 &lt;/style&gt;
 &lt;div class="csanim-barra"&gt;&lt;div class="csanim-barra__relleno"&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Pasa el cursor sobre la barra para pausar la animación.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="encadenar-varias-animaciones"&gt;Encadenar varias animaciones&lt;/h2&gt;
&lt;p&gt;Puedes aplicar varias animaciones a un mismo elemento separándolas con comas. Cada una mantiene su propia duración, retraso y curva, lo que permite componer comportamientos independientes:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;elemento&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;flotar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-in-out&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;alternate&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-flotar { from { transform:translateY(0); } to { transform:translateY(-12px); } }
 .csanim-flota { display:inline-block; background:#f39c12; color:#fff; padding:1em 1.6em; border-radius:.5em; box-shadow:0 .4em .8em rgba(0,0,0,.2); animation:csanim-flotar 1.8s ease-in-out infinite alternate; }
 &lt;/style&gt;
 &lt;span class="csanim-flota"&gt;Floto suavemente&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="accesibilidad-respeta-prefers-reduced-motion"&gt;Accesibilidad: respeta prefers-reduced-motion&lt;/h2&gt;
&lt;p&gt;El movimiento excesivo puede causar mareos o malestar a personas con sensibilidad vestibular. Los sistemas operativos exponen una preferencia de &amp;ldquo;reducir movimiento&amp;rdquo;, y CSS la consulta con la media query &lt;code&gt;prefers-reduced-motion&lt;/code&gt;. Es una responsabilidad profesional desactivar o atenuar las animaciones no esenciales cuando el usuario lo solicita:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;reduce&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:#56b6c2"&gt;*,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&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:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation-duration&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.01&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;ms&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation-iteration-count&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;transition-duration&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.01&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;ms&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&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;/code&gt;&lt;/pre&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;Ignorar &lt;code&gt;prefers-reduced-motion&lt;/code&gt; es un fallo de accesibilidad real. Reserva las animaciones llamativas para lo decorativo y asegúrate de que la interfaz siga siendo plenamente funcional cuando el movimiento se reduce.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="rendimiento-anima-en-la-capa-de-composición"&gt;Rendimiento: anima en la capa de composición&lt;/h2&gt;
&lt;p&gt;La misma regla de oro de las transiciones aplica aquí: anima propiedades que solo afecten la etapa de &lt;strong&gt;composición&lt;/strong&gt; del navegador —&lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;— en lugar de propiedades que disparen &lt;em&gt;layout&lt;/em&gt; o &lt;em&gt;paint&lt;/em&gt; (&lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;margin&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* ❌ Costoso: recalcula layout en cada frame */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;mover-malo&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&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:#7f848e"&gt;/* ✅ Eficiente: solo composición, fluido a 60 fps */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;mover-bien&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Si una animación se ve entrecortada, lo primero que debes revisar es qué propiedades estás animando. Reescribir un &lt;code&gt;left&lt;/code&gt;/&lt;code&gt;top&lt;/code&gt; como &lt;code&gt;transform: translate()&lt;/code&gt; suele eliminar el &lt;em&gt;jank&lt;/em&gt; de inmediato.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las animaciones con &lt;code&gt;@keyframes&lt;/code&gt; te dan un lenguaje declarativo para describir movimiento complejo: secuencias multipaso, bucles infinitos y comportamientos compuestos, todo en CSS puro. Dominar la propiedad &lt;code&gt;animation&lt;/code&gt; y sus subpropiedades —especialmente &lt;code&gt;fill-mode&lt;/code&gt;, &lt;code&gt;iteration-count&lt;/code&gt; y &lt;code&gt;play-state&lt;/code&gt;— te permite construir spinners, indicadores de carga y microinteracciones pulidas. Y recuerda: anima &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;, y respeta siempre &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&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;🚀 Con esta entrega completas el recorrido de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;: desde la cascada y los selectores hasta el layout, el posicionamiento, los fondos, las transformaciones y, ahora, las animaciones. Tienes el repertorio completo para escribir CSS expresivo, accesible y de alto rendimiento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>TypeScript: Interfaces y contratos de tipos</title><link>https://blog.dacadev.com/programacion/typescript/interfaces/</link><pubDate>Thu, 18 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/interfaces/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las interfaces en TypeScript: contratos extensibles, herencia con extends, implementación en clases, diferencias con type y declaration merging.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/interfaces/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="#bases-definir-y-extender-interfaces"&gt;Bases: definir y extender interfaces&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estructuras-complejas-interfaces-anidadas"&gt;Estructuras complejas: interfaces anidadas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#métodos-en-la-interfaz"&gt;Métodos en la interfaz&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementar-interfaces-en-clases"&gt;Implementar interfaces en clases&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#interfaces-para-tipar-funciones"&gt;Interfaces para tipar funciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#interfaces-frente-a-alias-de-tipo"&gt;Interfaces frente a alias de tipo&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-composición"&gt;1. Composición&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-restricción-al-extender"&gt;2. Restricción al extender&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-declaration-merging"&gt;3. Declaration merging&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-con-readonly-y-múltiples-contratos"&gt;Implementación con readonly y múltiples contratos&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;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;Quinto artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Estudiaremos las interfaces como contratos extensibles, su herencia con &lt;code&gt;extends&lt;/code&gt;, su implementación en clases con &lt;code&gt;implements&lt;/code&gt;, y sus diferencias frente a los alias de tipo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Una &lt;strong&gt;interface&lt;/strong&gt; en TypeScript define la forma que deben cumplir los objetos. A primera vista se parece a un alias de tipo, pero su rasgo distintivo es la &lt;strong&gt;extensibilidad&lt;/strong&gt;: las interfaces están diseñadas para componerse, heredarse y servir como base de contratos más complejos. Analicemos cuándo y cómo usarlas.&lt;/p&gt;
&lt;h2 id="bases-definir-y-extender-interfaces"&gt;Bases: definir y extender interfaces&lt;/h2&gt;
&lt;p&gt;Una interface declara la estructura de un objeto. Con &lt;code&gt;extends&lt;/code&gt;, una interface puede heredar de otra y ampliar su contrato:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hero&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#e06c75"&gt;age?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&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 style="color:#e06c75"&gt;getName&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:#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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Avenger&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hero&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;marvel&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;flash&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Hero&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Barry Allen&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;24&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;super velocidad&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;viajar en el tiempo&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;&lt;code&gt;Avenger&lt;/code&gt; hereda todos los miembros de &lt;code&gt;Hero&lt;/code&gt; y añade &lt;code&gt;marvel&lt;/code&gt;. Esta composición es la base del diseño orientado a contratos.&lt;/p&gt;
&lt;h2 id="estructuras-complejas-interfaces-anidadas"&gt;Estructuras complejas: interfaces anidadas&lt;/h2&gt;
&lt;p&gt;Las interfaces pueden referenciarse entre sí para modelar estructuras de datos compuestas:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Client&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#e06c75"&gt;age?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;address?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Address&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Address&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;zip&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 style="color:#e06c75"&gt;city&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;client&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Client&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;David&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;address&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;id&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;125&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;zip&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;KYD 234&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;city&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Chía&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&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;client2&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Client&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Melissa&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;30&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;&lt;code&gt;Client&lt;/code&gt; referencia a &lt;code&gt;Address&lt;/code&gt; como un campo opcional, lo que permite componer entidades de dominio sin acoplarlas en una sola definición monolítica.&lt;/p&gt;
&lt;h2 id="métodos-en-la-interfaz"&gt;Métodos en la interfaz&lt;/h2&gt;
&lt;p&gt;Al igual que los alias de tipo, las interfaces pueden declarar métodos como parte del contrato:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Client&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#e06c75"&gt;age?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;address?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Address&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;getFullAddress&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&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;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;Declarar métodos en una interface es válido, pero implica que el objeto que la cumpla debe implementarlos. En la práctica, cuando un contrato requiere comportamiento, lo más limpio es implementarlo mediante una clase.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="implementar-interfaces-en-clases"&gt;Implementar interfaces en clases&lt;/h2&gt;
&lt;p&gt;Una clase adopta uno o varios contratos con la palabra clave &lt;code&gt;implements&lt;/code&gt;. Esto garantiza, en compilación, que la clase provee todo lo que el contrato exige:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#e06c75"&gt;realName&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 style="color:#e06c75"&gt;mutantPower&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Human&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Mutant&lt;/span&gt; &lt;span style="color:#c678dd"&gt;implements&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Xmen&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Human&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;public&lt;/span&gt; &lt;span style="color:#e06c75"&gt;realName&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 style="color:#e06c75"&gt;mutantPower&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;id&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&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 style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Hola mundo&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Mutant&lt;/code&gt; implementa simultáneamente &lt;code&gt;Xmen&lt;/code&gt; y &lt;code&gt;Human&lt;/code&gt;. Si omitiera cualquier miembro requerido, el compilador lo rechazaría.&lt;/p&gt;
&lt;h2 id="interfaces-para-tipar-funciones"&gt;Interfaces para tipar funciones&lt;/h2&gt;
&lt;p&gt;Aunque es poco frecuente, una interface puede describir la firma de una función antes de asignarle una implementació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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;AddTwoNumbers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;addNumbers&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;AddTwoNumbers&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;addNumbers&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&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 style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="interfaces-frente-a-alias-de-tipo"&gt;Interfaces frente a alias de tipo&lt;/h2&gt;
&lt;p&gt;Esta es la decisión de diseño más común. Las tres diferencias clave:&lt;/p&gt;
&lt;h3 id="1-composición"&gt;1. Composición&lt;/h3&gt;
&lt;p&gt;Los alias de tipo componen mediante operaciones de conjuntos (&lt;code&gt;|&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;); las interfaces componen mediante &lt;code&gt;extends&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Food&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;calories&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;tasty&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Sushi&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Food&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;amp;&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;salty&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&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;FoodI&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;calories&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;tasty&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&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;SushiI&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;FoodI&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;salty&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-restricción-al-extender"&gt;2. Restricción al extender&lt;/h3&gt;
&lt;p&gt;Al extender una interface, no puedes &lt;strong&gt;cambiar&lt;/strong&gt; el tipo de un miembro heredado, solo añadir o restringir de forma compatible. Una incompatibilidad genera error:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;good&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&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 style="color:#e06c75"&gt;bad&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;B&lt;/span&gt; &lt;span style="color:#c678dd"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;good&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&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 style="color:#e06c75"&gt;bad&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2430: &amp;#39;B&amp;#39; extiende incorrectamente &amp;#39;A&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;h3 id="3-declaration-merging"&gt;3. Declaration merging&lt;/h3&gt;
&lt;p&gt;Varias interfaces con el mismo nombre en el mismo ámbito &lt;strong&gt;se fusionan automáticamente&lt;/strong&gt;; varios alias de tipo con el mismo nombre producen un error de compilació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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;User&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;User&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; } &lt;span style="color:#7f848e"&gt;// se fusiona
&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;User&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Ashley&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;30&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;User&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; } &lt;span style="color:#7f848e"&gt;// Error TS2300: identificador duplicado
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;User&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; } &lt;span style="color:#7f848e"&gt;// Error TS2300
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El &lt;em&gt;declaration merging&lt;/em&gt; respeta los tipos existentes: no puedes redefinir un miembro ya declarado con otro tipo.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Q{¿Necesitas extensibilidad,&lt;br/&gt;implements o merging?}
 Q -- Sí --&gt; I[Usa interface]
 Q -- "No (uniones, tuplas, mapeos)" --&gt; T[Usa type]
&lt;/pre&gt;

&lt;h2 id="implementación-con-readonly-y-múltiples-contratos"&gt;Implementación con readonly y múltiples contratos&lt;/h2&gt;
&lt;p&gt;Las interfaces admiten propiedades &lt;code&gt;readonly&lt;/code&gt; y permiten que una clase cumpla varios contratos a la vez:&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Animal&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;readonly&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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 style="color:#e06c75"&gt;eat&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;food&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;sleep&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;hours&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&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;interface&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Feline&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;meow&lt;/span&gt;()&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;void&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;class&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Cat&lt;/span&gt; &lt;span style="color:#c678dd"&gt;implements&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Animal&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Feline&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Whiskers&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;eat&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;food&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;) { &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;info&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Ate some&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;food&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;sleep&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;hours&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;) { &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;info&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Slept for&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;hours&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;hours&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;meow() {&lt;/span&gt; &lt;span style="color:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;info&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Meow&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;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las interfaces son el mecanismo de TypeScript para definir contratos extensibles y verificables. Elige una interface cuando necesites herencia con &lt;code&gt;extends&lt;/code&gt;, implementación en clases con &lt;code&gt;implements&lt;/code&gt; o &lt;em&gt;declaration merging&lt;/em&gt;; reserva los alias de tipo para uniones, intersecciones, tuplas y tipos mapeados.&lt;/p&gt;
&lt;p&gt;En el próximo artículo profundizaremos en las &lt;strong&gt;clases&lt;/strong&gt;, la herencia, los modificadores de acceso y los patrones de diseño que habilitan.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Funciones, parámetros y generadores</title><link>https://blog.dacadev.com/programacion/typescript/funciones/</link><pubDate>Wed, 17 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/funciones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a tipar funciones en TypeScript: tipos de retorno, parámetros opcionales y por defecto, operador resto, call signatures, generadores e iteradores.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/functions/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="#declaración-y-tipado-de-funciones"&gt;Declaración y tipado de funciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#parámetros-opcionales-y-por-defecto"&gt;Parámetros opcionales y por defecto&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#operador-resto-funciones-variádicas"&gt;Operador resto: funciones variádicas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#call-apply-y-bind"&gt;call, apply y bind&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#generadores"&gt;Generadores&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#iteradores"&gt;Iteradores&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#call-signatures"&gt;Call signatures&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;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;Cuarto artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Cubriremos el tipado de funciones: parámetros, tipos de retorno, parámetros opcionales y por defecto, el operador resto, &lt;em&gt;call signatures&lt;/em&gt;, generadores e iteradores.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las funciones son el núcleo de cualquier base de código, y es justo donde el tipado aporta más valor: una firma bien tipada documenta el contrato de entrada y salida, y convierte cualquier llamada inválida en un error de compilación. Analicemos cómo TypeScript modela las &lt;strong&gt;funciones&lt;/strong&gt; en toda su variedad.&lt;/p&gt;
&lt;h2 id="declaración-y-tipado-de-funciones"&gt;Declaración y tipado de funciones&lt;/h2&gt;
&lt;p&gt;Una función tipada declara el tipo de cada parámetro y, opcionalmente, el tipo de retorno:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;add&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&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;TypeScript admite todas las formas de definir funciones de JavaScript, y a todas les aplica el mismo sistema de tipos:&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:#7f848e"&gt;// Named function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;greet&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;hello &amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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:#7f848e"&gt;// Function expression
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;greet2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;function&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;name&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 style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;hello &amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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:#7f848e"&gt;// Arrow function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;greet3&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&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:#98c379"&gt;&amp;#39;hello &amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&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:#7f848e"&gt;// Shorthand arrow function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;greet4&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;hello &amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El tipado de los parámetros intercepta llamadas inválidas en el sitio exacto del error:&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:#e06c75"&gt;add&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// Error TS2554: se esperaban 2 argumentos, se recibió 1.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;add&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// Error TS2345: &amp;#39;string&amp;#39; no es asignable a &amp;#39;number&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="parámetros-opcionales-y-por-defecto"&gt;Parámetros opcionales y por defecto&lt;/h2&gt;
&lt;p&gt;Un parámetro opcional se marca con &lt;code&gt;?&lt;/code&gt; y debe gestionarse dentro del cuerpo, ya que puede llegar como &lt;code&gt;undefined&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;message&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;userId?&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 style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;time&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Date&lt;/span&gt;().&lt;span style="color:#e06c75"&gt;toLocaleTimeString&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:#e06c75"&gt;time&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;message&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;userId&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;||&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Not signed in&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;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;Page loaded&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;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;User signed in&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;da763be&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un parámetro con valor por defecto se vuelve opcional automáticamente, y TypeScript infiere su tipo a partir del valor asignado:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;message&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;userId&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Not signed in&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;time&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Date&lt;/span&gt;().&lt;span style="color:#e06c75"&gt;toISOString&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:#e06c75"&gt;time&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;message&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;userId&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;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;Los parámetros opcionales deben ubicarse &lt;strong&gt;después&lt;/strong&gt; de todos los obligatorios, y no pueden combinarse con el operador resto.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;También puedes apoyarte en un &lt;code&gt;type&lt;/code&gt; para estructurar parámetros de configuració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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Context&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;appId?&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 style="color:#e06c75"&gt;userId?&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;message&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;context&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Context&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:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;time&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#c678dd"&gt;new&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Date&lt;/span&gt;().&lt;span style="color:#e06c75"&gt;toISOString&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:#e06c75"&gt;time&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;message&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;context&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;userId&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;h2 id="operador-resto-funciones-variádicas"&gt;Operador resto: funciones variádicas&lt;/h2&gt;
&lt;p&gt;El operador resto captura un número dinámico de argumentos en un arreglo tipado, lo que produce firmas más legibles que recibir un arreglo explícito:&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:#7f848e"&gt;// Recibe un arreglo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sum&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;numbers&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;numbers&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;total&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;n&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;total&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;n&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;sum&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:#7f848e"&gt;// 6
&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:#7f848e"&gt;// Variádica con operador resto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sumVariadicSafe&lt;/span&gt;(...&lt;span style="color:#e06c75"&gt;numbers&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;numbers&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;total&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;n&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;total&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;n&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;sumVariadicSafe&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:#7f848e"&gt;// 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="call-apply-y-bind"&gt;call, apply y bind&lt;/h2&gt;
&lt;p&gt;TypeScript respeta los mecanismos clásicos de invocación de JavaScript, aplicando la verificación de tipos a sus argumentos:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;add&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&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;add&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 style="color:#7f848e"&gt;// 30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;add&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;apply&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;null&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 style="color:#7f848e"&gt;// 30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;add&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;call&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;null&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 style="color:#7f848e"&gt;// 30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;add&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;bind&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;null&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 style="color:#7f848e"&gt;// 30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="generadores"&gt;Generadores&lt;/h2&gt;
&lt;p&gt;Los generadores producen valores bajo demanda. Se declaran con un asterisco tras &lt;code&gt;function&lt;/code&gt; y emiten valores con &lt;code&gt;yield&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;function&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#e06c75"&gt;createFibonacciGenerator() {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&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 style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&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 style="color:#c678dd"&gt;while&lt;/span&gt; (&lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;yield&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;[&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#e06c75"&gt;b&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;fib&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;createFibonacciGenerator&lt;/span&gt;() &lt;span style="color:#7f848e"&gt;// IterableIterator&amp;lt;number&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;fib&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;next&lt;/span&gt;() &lt;span style="color:#7f848e"&gt;// { value: 0, done: false }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fib&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;next&lt;/span&gt;() &lt;span style="color:#7f848e"&gt;// { value: 1, done: false }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fib&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;next&lt;/span&gt;() &lt;span style="color:#7f848e"&gt;// { value: 1, done: false }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;fib&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;next&lt;/span&gt;() &lt;span style="color:#7f848e"&gt;// { value: 2, done: false }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El método &lt;code&gt;next()&lt;/code&gt; extrae el siguiente valor de la secuencia. TypeScript infiere el tipo &lt;code&gt;IterableIterator&amp;lt;number&amp;gt;&lt;/code&gt; a partir de lo que produce &lt;code&gt;yield&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="iteradores"&gt;Iteradores&lt;/h2&gt;
&lt;p&gt;Un iterador se define implementando el método &lt;code&gt;[Symbol.iterator]&lt;/code&gt;. TypeScript es capaz de reconocer la estructura y tiparla correctamente:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;numbers&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:#56b6c2"&gt;*&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;Symbol&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;iterator&lt;/span&gt;]() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;n&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:#e06c75"&gt;n&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;n&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:#c678dd"&gt;yield&lt;/span&gt; &lt;span style="color:#e06c75"&gt;n&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="call-signatures"&gt;Call signatures&lt;/h2&gt;
&lt;p&gt;Una &lt;em&gt;call signature&lt;/em&gt; describe el tipo de una función de forma independiente a su implementación. Para la siguiente funció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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sum&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&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;su firma de llamada se expresa así:&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:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;b&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 style="color:#e5c07b"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El tipo genérico &lt;code&gt;Function&lt;/code&gt; es un comodín que no aporta información sobre la firma concreta; las &lt;em&gt;call signatures&lt;/em&gt; permiten tipar funciones con precisión. Además, cuando una función puede retornar varios tipos, cada uno debe tratarse para satisfacer al typechecker:&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;area&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;radius&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;)&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;radius&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;&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 style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&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;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Math&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;PI&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#e06c75"&gt;radius&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;**&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;area&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;!==&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&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;info&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;result:&amp;#39;&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// dentro del guard, a es number
&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;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El tipado de funciones convierte cada firma en un contrato verificable: parámetros opcionales y por defecto modelan flexibilidad controlada, el operador resto expresa funciones variádicas con claridad, las &lt;em&gt;call signatures&lt;/em&gt; tipan funciones como ciudadanos de primera clase, y los generadores e iteradores se integran sin fricción en el sistema de tipos.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo abordaremos las &lt;strong&gt;interfaces&lt;/strong&gt;, el mecanismo de TypeScript para definir contratos extensibles.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Modularización y patrones de diseño</title><link>https://blog.dacadev.com/programacion/estilos-css/modularizacion-y-patrones/</link><pubDate>Tue, 16 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/modularizacion-y-patrones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a organizar CSS a escala: estilos base, componentes modulares, la metodología BEM, clases de utilidad y la documentación con librerías de patrones.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/08-modularizacion-y-patrones-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é-es-la-modularización"&gt;Qué es la modularización&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estilos-base"&gt;Estilos base&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#componentes-y-bem"&gt;Componentes y BEM&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-del-componente"&gt;Posicionamiento del componente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estado-de-los-componentes"&gt;Estado de los componentes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#utility-classes"&gt;Utility classes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#metodologías-de-arquitectura-css"&gt;Metodologías de arquitectura CSS&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#librerías-de-patrones"&gt;Librerías de patrones&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 un proyecto pequeño cualquier organización de CSS funciona. El problema aparece al escalar: hojas de estilo de miles de líneas donde tocar una regla rompe tres componentes que parecían no tener relación. La causa casi siempre es la misma: estilos acoplados que se pisan entre sí. La solución es arquitectónica —modularizar— y existen metodologías probadas para lograrlo.&lt;/p&gt;
&lt;p&gt;Esta es la octava y última entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Veremos cómo estructurar estilos en módulos independientes, la metodología &lt;strong&gt;BEM&lt;/strong&gt;, las clases de utilidad y cómo documentar tus componentes con una librería de patrones.&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;Aprenderás a dividir tus estilos en componentes desacoplados, a nombrar clases con BEM, a usar utility classes con criterio y a mantener una librería de patrones como fuente única de verdad del diseño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-la-modularización"&gt;Qué es la modularización&lt;/h2&gt;
&lt;p&gt;Modularizar CSS consiste en dividir los estilos en archivos donde cada uno representa un &lt;strong&gt;módulo&lt;/strong&gt;: un único componente con todo su estilo encapsulado. Un módulo &lt;code&gt;button.css&lt;/code&gt; contiene todo lo necesario para renderizar un botón y sus variantes, y nada más.&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;La regla de oro: un módulo no debe interferir con los estilos de otros. Solo se ocupa de su propio componente. Así, modificar un módulo nunca produce efectos colaterales inesperados en el resto de la página.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="estilos-base"&gt;Estilos base&lt;/h2&gt;
&lt;p&gt;Antes de los módulos conviene tener un archivo de &lt;strong&gt;estilos base&lt;/strong&gt;: no es un componente, sino la configuración inicial del documento (reset, tipografía global, &lt;code&gt;box-sizing&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&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:#56b6c2"&gt;*,&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inherit&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;body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Helvetica&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Arial&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;sans-serif&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para no reinventar la rueda, paquetes como &lt;a href="https://necolas.github.io/normalize.css/"




 target="_blank"
 


&gt;Normalize.css&lt;/a&gt; homogeneizan las diferencias entre navegadores de forma sensata.&lt;/p&gt;
&lt;h2 id="componentes-y-bem"&gt;Componentes y BEM&lt;/h2&gt;
&lt;p&gt;La idea central de un módulo es que los estilos y modificadores de un componente vivan en un solo lugar. La metodología &lt;strong&gt;BEM&lt;/strong&gt; (&lt;em&gt;Block, Element, Modifier&lt;/em&gt;) propone una convención de nombres que hace explícita la estructura y evita colisiones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; — el componente raíz: &lt;code&gt;.button&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element&lt;/strong&gt; — una parte del componente, con &lt;code&gt;__&lt;/code&gt;: &lt;code&gt;.button__icon&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modifier&lt;/strong&gt; — una variante, con &lt;code&gt;--&lt;/code&gt;: &lt;code&gt;.button--success&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;solid&lt;/span&gt; &lt;span style="color:#d19a66"&gt;#265559&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&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:#e5c07b"&gt;button--success&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2f5926&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#cfe8c9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--danger&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#a92323&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#e8c9c9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--small&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--large&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;&amp;gt;Normal&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--success&amp;#34;&lt;/span&gt;&amp;gt;Éxito&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--danger&amp;#34;&lt;/span&gt;&amp;gt;Peligro&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--large&amp;#34;&lt;/span&gt;&amp;gt;Grande&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:.75rem;flex-wrap:wrap;align-items:center;"&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #265559;border-radius:.2em;background:transparent;font-size:1rem;color:#265559;cursor:pointer;"&gt;Normal&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #cfe8c9;border-radius:.2em;background:#2f5926;font-size:1rem;color:#fff;cursor:pointer;"&gt;Éxito&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #e8c9c9;border-radius:.2em;background:#a92323;font-size:1rem;color:#fff;cursor:pointer;"&gt;Peligro&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #265559;border-radius:.2em;background:transparent;font-size:1.2rem;color:#265559;cursor:pointer;"&gt;Grande&lt;/button&gt;
&lt;/div&gt;
&lt;h3 id="posicionamiento-del-componente"&gt;Posicionamiento del componente&lt;/h3&gt;
&lt;p&gt;Por buena práctica, el bloque raíz de un componente debería declarar &lt;code&gt;position: relative&lt;/code&gt;. Así estableces un contexto de posicionamiento controlado para cualquier elemento absoluto interno (un menú desplegable, un badge, un tooltip), sin depender de ancestros externos.&lt;/p&gt;
&lt;h3 id="estado-de-los-componentes"&gt;Estado de los componentes&lt;/h3&gt;
&lt;p&gt;Es común reflejar el estado de un componente con clases, ya sea para estilizarlo o para manipularlo desde JavaScript. La convención recomendada usa verbos o estados con prefijo: &lt;code&gt;is-loading&lt;/code&gt;, &lt;code&gt;has-error&lt;/code&gt;, &lt;code&gt;is-active&lt;/code&gt;.&lt;/p&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;No mezcles las clases de estado con los modificadores BEM. Evita nombres como &lt;code&gt;block__element--modifier-is-loading&lt;/code&gt;. El estado es una capa transversal y dinámica; mantenlo separado de la variante estática del componente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="utility-classes"&gt;Utility classes&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;clases de utilidad&lt;/strong&gt; aplican un estilo único y específico. Suelen usar &lt;code&gt;!important&lt;/code&gt; para garantizar que se apliquen por encima de los estilos del componente:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;text-center&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-align&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;float-left&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;float&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;hidden&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&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:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&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:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;table&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;clear&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;both&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Son útiles para ajustes puntuales, pero abusar de ellas reintroduce el acoplamiento que la modularización busca evitar. Úsalas con criterio.&lt;/p&gt;
&lt;h2 id="metodologías-de-arquitectura-css"&gt;Metodologías de arquitectura CSS&lt;/h2&gt;
&lt;p&gt;BEM no es la única opción. Las metodologías más establecidas para organizar CSS a escala son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OOCSS&lt;/strong&gt; — &lt;em&gt;Object-Oriented CSS&lt;/em&gt;, de Nicole Sullivan: separa estructura de apariencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMACSS&lt;/strong&gt; — &lt;em&gt;Scalable and Modular Architecture for CSS&lt;/em&gt;, de Jonathan Snook: categoriza las reglas en capas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BEM&lt;/strong&gt; — &lt;em&gt;Block, Element, Modifier&lt;/em&gt;, de Yandex: convención de nombres explícita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ITCSS&lt;/strong&gt; — &lt;em&gt;Inverted Triangle CSS&lt;/em&gt;, de Harry Roberts: organiza por especificidad creciente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No son excluyentes; muchos equipos combinan ITCSS para la estructura de archivos con BEM para la nomenclatura.&lt;/p&gt;
&lt;h2 id="librerías-de-patrones"&gt;Librerías de patrones&lt;/h2&gt;
&lt;p&gt;En proyectos grandes, los componentes se documentan en una &lt;strong&gt;librería de patrones&lt;/strong&gt; (o &lt;em&gt;style guide&lt;/em&gt;): una web accesible para todo el equipo que muestra cómo se ve y se comporta cada componente. Es la fuente única de verdad del diseño y reduce las inconsistencias.&lt;/p&gt;
&lt;p&gt;Existen generadores de style guides; uno open source muy conocido es &lt;a href="https://kss-node.github.io/kss-node/"




 target="_blank"
 


&gt;KSS&lt;/a&gt;. Documenta los componentes a partir de comentarios estructurados en el propio CSS:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Buttons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Botones disponibles en varios tamaños y colores.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Markup:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;&amp;lt;button class=&amp;#34;button {{modifier_class}}&amp;#34;&amp;gt;click here&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--success - Botón verde de éxito
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--danger - Botón rojo de peligro
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--large - Botón grande
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Styleguide Buttons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;KSS lee esos comentarios y genera automáticamente una página de documentación con el componente renderizado y todas sus variantes. El bloque incluye un título, una descripción, el &lt;code&gt;Markup&lt;/code&gt; de ejemplo (con el marcador &lt;code&gt;{{modifier_class}}&lt;/code&gt;), la lista de modificadores y una referencia &lt;code&gt;Styleguide&lt;/code&gt; para ubicarlo en la jerarquía.&lt;/p&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;Mantener la documentación junto al código —en comentarios del propio CSS— reduce el riesgo de que la librería de patrones quede desactualizada respecto a la implementación real.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Escribir CSS que escale es, ante todo, un problema de arquitectura. Modularizar en componentes desacoplados, nombrar con una convención consistente como BEM, reservar las utility classes para ajustes puntuales y documentar todo en una librería de patrones es lo que mantiene una hoja de estilos sana a medida que el proyecto crece.&lt;/p&gt;
&lt;p&gt;Con esta entrega cerramos la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorrimos desde los fundamentos de la cascada hasta la arquitectura de estilos a gran escala, pasando por selectores, el modelo de caja, layouts, posicionamiento, fondos y animaciones. Tienes ahora un modelo mental completo para escribir CSS profesional, predecible y mantenible.&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;🚀 Repasa las entregas anteriores para consolidar cada concepto: los fundamentos sostienen los selectores, el modelo de caja sostiene los layouts, y la modularización une todo en un sistema coherente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>TypeScript: Objetos y tipos personalizados</title><link>https://blog.dacadev.com/programacion/typescript/objetos-y-tipos-personalizados/</link><pubDate>Tue, 16 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/objetos-y-tipos-personalizados/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a tipar objetos literales en TypeScript, definir tipos personalizados con type, usar campos opcionales y métodos, y permitir múltiples tipos con uniones.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/objects-custom-types/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="#objetos-literales-y-la-inferencia-estructural"&gt;Objetos literales y la inferencia estructural&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tipar-objetos-de-forma-inline"&gt;Tipar objetos de forma inline&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tipos-personalizados-con-type"&gt;Tipos personalizados con type&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#permitir-múltiples-tipos-con-uniones"&gt;Permitir múltiples tipos con uniones&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;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;Tercer artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Diseñaremos la forma de nuestros objetos con tipos personalizados, definiremos campos opcionales y métodos, y permitiremos que una variable acepte múltiples tipos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Modelar correctamente la estructura de los objetos es donde TypeScript empieza a pagar dividendos en proyectos reales. Un &lt;strong&gt;tipo personalizado&lt;/strong&gt; bien diseñado centraliza la definición de una entidad, propaga su forma por todo el código y convierte cualquier desviación en un error de compilación. Analicemos cómo pasar de objetos literales sueltos a un modelo de tipos mantenible.&lt;/p&gt;
&lt;h2 id="objetos-literales-y-la-inferencia-estructural"&gt;Objetos literales y la inferencia estructural&lt;/h2&gt;
&lt;p&gt;Los objetos literales funcionan igual que en JavaScript, pero TypeScript infiere automáticamente su estructura. Esa inferencia es justamente lo que impide reasignar un objeto con una forma distinta:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;flash&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Barry Allen&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;24&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;super velocidad&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;viajar en el tiempo&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;flash&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name2&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Otro nombre&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// Error: el literal solo puede especificar propiedades conocidas;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// &amp;#39;name2&amp;#39; no existe en el tipo inferido y faltan &amp;#39;name&amp;#39;, &amp;#39;age&amp;#39;, &amp;#39;powers&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TypeScript bloquea la reasignación porque el nuevo literal no respeta la forma deducida de &lt;code&gt;flash&lt;/code&gt;. Este comportamiento evita introducir campos accidentales o incompletos.&lt;/p&gt;
&lt;h2 id="tipar-objetos-de-forma-inline"&gt;Tipar objetos de forma inline&lt;/h2&gt;
&lt;p&gt;Podemos declarar explícitamente la forma del objeto usando la misma sintaxis de anotación que venimos aplicando, incluyendo campos opcionales con &lt;code&gt;?&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;flash&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;age?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Barry Allen&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;24&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;super velocidad&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;viajar en el tiempo&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;flash&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Clark Kent&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;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;volar&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;rayo láser&amp;#39;&lt;/span&gt;] &lt;span style="color:#7f848e"&gt;// &amp;#39;age&amp;#39; es opcional, puede omitirse
&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;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;La posición de un campo opcional dentro de la anotación es irrelevante. &lt;code&gt;age?&lt;/code&gt; puede ir en medio de la definición sin afectar la validez de los objetos que lo omitan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El problema de este enfoque &lt;em&gt;inline&lt;/em&gt; es la duplicación: si dos variables deben compartir la misma forma, hay que repetir la anotación completa en cada una y mantenerlas sincronizadas manualmente. Esto no escala.&lt;/p&gt;
&lt;h2 id="tipos-personalizados-con-type"&gt;Tipos personalizados con type&lt;/h2&gt;
&lt;p&gt;La solución es definir la estructura una sola vez con la palabra clave &lt;code&gt;type&lt;/code&gt; y reutilizarla en todo el código. Esto centraliza el modelo en un único punto de verdad:&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hero&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;name&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 style="color:#e06c75"&gt;age?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&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 style="color:#e06c75"&gt;getName&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:#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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;flash&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Hero&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Barry Allen&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;24&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;super velocidad&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;viajar en el tiempo&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;superman&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Hero&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Clark Kent&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;30&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;volar&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;rayo láser&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;getName() {&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:#c678dd"&gt;this&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;name&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El tipo &lt;code&gt;Hero&lt;/code&gt; declara &lt;code&gt;name&lt;/code&gt; y &lt;code&gt;powers&lt;/code&gt; como obligatorios, &lt;code&gt;age&lt;/code&gt; como opcional y &lt;code&gt;getName&lt;/code&gt; como un &lt;strong&gt;método opcional&lt;/strong&gt; cuya firma es &lt;code&gt;() =&amp;gt; string&lt;/code&gt;. Cualquier objeto anotado con &lt;code&gt;Hero&lt;/code&gt; debe respetar este contrato, y un solo cambio en la definición se propaga a todas las variables que lo usan.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 T[type Hero] --&gt; A[flash: Hero]
 T --&gt; B[superman: Hero]
 T --&gt; C[...otros héroes]
 note["Un cambio en Hero&lt;br/&gt;se propaga a todos"] -.-&gt; T
&lt;/pre&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;Define un &lt;code&gt;type&lt;/code&gt; para toda entidad que aparezca más de una vez. La regla práctica: si copiarías la anotación inline por segunda vez, conviértela en un tipo personalizado.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="permitir-múltiples-tipos-con-uniones"&gt;Permitir múltiples tipos con uniones&lt;/h2&gt;
&lt;p&gt;Una variable puede aceptar más de un tipo mediante el operador de unión &lt;code&gt;|&lt;/code&gt;. Esto resulta útil para valores que legítimamente cambian de forma según el contexto:&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Hero&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;name&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 style="color:#e06c75"&gt;age?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;powers&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 style="color:#e06c75"&gt;getName&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:#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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;myCustomVariable&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Hero&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;¡Hola mundo!&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;myCustomVariable&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;42&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// válido: number
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;myCustomVariable&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;// válido: Hero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Diana&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;powers&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;fuerza sobrehumana&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;&lt;code&gt;myCustomVariable&lt;/code&gt; puede contener un &lt;code&gt;Hero&lt;/code&gt;, un &lt;code&gt;string&lt;/code&gt; o un &lt;code&gt;number&lt;/code&gt;. El typechecker permitirá únicamente operaciones válidas para todos los miembros de la unión hasta que acotes el tipo con un &lt;em&gt;type guard&lt;/em&gt; (por ejemplo, &lt;code&gt;typeof&lt;/code&gt; o una comprobación de propiedad).&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Pasar de objetos literales inline a tipos personalizados con &lt;code&gt;type&lt;/code&gt; es el salto que transforma TypeScript de una simple validación a una herramienta de diseño. Un tipo centraliza la forma de una entidad, los campos opcionales modelan la realidad de los datos incompletos, los métodos definen comportamiento esperado y las uniones aportan flexibilidad controlada.&lt;/p&gt;
&lt;p&gt;En el próximo artículo de la serie abordaremos las &lt;strong&gt;funciones&lt;/strong&gt;: anotación de parámetros, tipos de retorno, parámetros opcionales y sobrecargas.&lt;/p&gt;</content:encoded></item><item><title>TypeScript: Tipos básicos y el sistema de tipos</title><link>https://blog.dacadev.com/programacion/typescript/tipos-basicos/</link><pubDate>Mon, 15 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/tipos-basicos/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina los tipos básicos de TypeScript: any, unknown, boolean, number, bigint, string, symbol, objetos, alias, uniones, intersecciones, arreglos y tuplas.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/basic-types/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="#por-qué-importan-los-tipos-un-ejemplo-concreto"&gt;Por qué importan los tipos: un ejemplo concreto&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#any-la-puerta-de-escape-del-sistema-de-tipos"&gt;any: la puerta de escape del sistema de tipos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#unknown-la-alternativa-segura-a-any"&gt;unknown: la alternativa segura a any&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#boolean"&gt;boolean&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#number-y-bigint"&gt;number y bigint&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#string"&gt;string&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#symbol"&gt;symbol&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#objetos"&gt;Objetos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#alias-de-tipo"&gt;Alias de tipo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tipos-unión-e-intersección"&gt;Tipos unión e intersección&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#arreglos"&gt;Arreglos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tuplas"&gt;Tuplas&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;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;Segundo artículo de la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Recorreremos el alfabeto de tipos del lenguaje: desde &lt;code&gt;any&lt;/code&gt; y &lt;code&gt;unknown&lt;/code&gt; hasta uniones, intersecciones, tuplas y alias de tipo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Cuando el typechecker sabe que un valor es de tipo &lt;code&gt;T&lt;/code&gt;, no solo conoce su naturaleza: también sabe &lt;strong&gt;exactamente qué operaciones son válidas&lt;/strong&gt; sobre ese valor y cuáles no. Ese es el propósito del sistema de tipos. Comprender el catálogo de &lt;strong&gt;tipos básicos en TypeScript&lt;/strong&gt; es la base sobre la que se construye todo lo demás, así que dediquémosle la atención que merece.&lt;/p&gt;
&lt;h2 id="por-qué-importan-los-tipos-un-ejemplo-concreto"&gt;Por qué importan los tipos: un ejemplo concreto&lt;/h2&gt;
&lt;p&gt;Los tipos transmiten intención de forma explícita y verificable. Comparemos la misma función en JavaScript y en TypeScript:&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:#7f848e"&gt;// JavaScript
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;squareOf&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;n&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;n&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#e06c75"&gt;n&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;squareOf&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;squareOf&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// NaN — falla en silencio
&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:#7f848e"&gt;// TypeScript
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;squareOf&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;n&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&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;n&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; &lt;span style="color:#e06c75"&gt;n&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;squareOf&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;squareOf&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// Error TS2345: el argumento de tipo &amp;#39;string&amp;#39; no es
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;// asignable al parámetro de tipo &amp;#39;number&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En JavaScript, &lt;code&gt;squareOf('z')&lt;/code&gt; devuelve &lt;code&gt;NaN&lt;/code&gt; sin protestar y el error se propaga aguas abajo. En TypeScript el compilador lo intercepta en el sitio exacto donde se cometió.&lt;/p&gt;
&lt;h2 id="any-la-puerta-de-escape-del-sistema-de-tipos"&gt;any: la puerta de escape del sistema de tipos&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;any&lt;/code&gt; indica que una variable puede contener cualquier tipo de dato. Desactiva por completo la verificació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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;avenger&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;any&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;123&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;avenger&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Dr. Strange&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;((&lt;span style="color:#e06c75"&gt;avenger&lt;/span&gt; &lt;span style="color:#c678dd"&gt;as&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;).&lt;span style="color:#e06c75"&gt;charAt&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;avenger&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15.23425&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;((&amp;lt;&lt;span style="color:#e06c75"&gt;number&lt;/span&gt;&amp;gt;&lt;span style="color:#e06c75"&gt;avenger&lt;/span&gt;).&lt;span style="color:#e06c75"&gt;toFixed&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cuando usas &lt;code&gt;any&lt;/code&gt;, el typechecker deja de ayudarte. Puedes reorientarlo mediante un &lt;em&gt;cast&lt;/em&gt; —indicar manualmente qué tipo debe asumir en un punto dado— con la sintaxis &lt;code&gt;(variable as Tipo)&lt;/code&gt; o &lt;code&gt;&amp;lt;Tipo&amp;gt;variable&lt;/code&gt;.&lt;/p&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 &lt;code&gt;any&lt;/code&gt; salvo en migraciones puntuales o fronteras con código sin tipado. Cada &lt;code&gt;any&lt;/code&gt; es un agujero por el que se filtran errores que el compilador debería haber detenido.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="unknown-la-alternativa-segura-a-any"&gt;unknown: la alternativa segura a any&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;unknown&lt;/code&gt; es el primo responsable de &lt;code&gt;any&lt;/code&gt;. Acepta cualquier valor, pero &lt;strong&gt;TypeScript prohíbe operar sobre él&lt;/strong&gt; hasta que acotes su tipo mediante una comprobación. Esto añade una capa de seguridad: sí admite operaciones de comparación e identidad (&lt;code&gt;==&lt;/code&gt;, &lt;code&gt;===&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, el operador ternario &lt;code&gt;?&lt;/code&gt;) y negación con &lt;code&gt;!&lt;/code&gt;, pero no el acceso a propiedades arbitrarias.&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;dato&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;unknown&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;obtenerValor&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:#7f848e"&gt;// dato.toFixed(2) // Error: &amp;#39;dato&amp;#39; es de tipo &amp;#39;unknown&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;if&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;typeof&lt;/span&gt; &lt;span style="color:#e06c75"&gt;dato&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;number&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;dato&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;toFixed&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// OK: dentro del guard, dato es number
&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;Usa &lt;code&gt;unknown&lt;/code&gt; siempre que recibas datos externos (respuestas de API, entrada del usuario) en lugar de &lt;code&gt;any&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="boolean"&gt;boolean&lt;/h2&gt;
&lt;p&gt;Acepta las operaciones &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;===&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, el ternario &lt;code&gt;?&lt;/code&gt; y la negación &lt;code&gt;!&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// boolean
&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;c&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// true (tipo literal)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;d&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// boolean
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;e&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2322: &amp;#39;false&amp;#39; no es asignable a &amp;#39;true&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;El tipo &lt;code&gt;true&lt;/code&gt; (literal) es más restrictivo que &lt;code&gt;boolean&lt;/code&gt;: además de exigir un booleano, exige que su valor sea exactamente &lt;code&gt;true&lt;/code&gt;. Los &lt;strong&gt;tipos literales&lt;/strong&gt; son una herramienta poderosa para modelar estados precisos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="number-y-bigint"&gt;number y bigint&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;number&lt;/code&gt; cubre enteros, flotantes, &lt;code&gt;Infinity&lt;/code&gt;, &lt;code&gt;NaN&lt;/code&gt; y valores positivos y negativos:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1234&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// number
&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;c&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5678&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// 5678 (literal)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;e&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// number
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;26.218&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;26.218&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// 26.218 (literal)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;g&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;26.218&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2322
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un &lt;code&gt;number&lt;/code&gt; representa con precisión hasta 2^53. Para enteros mayores existe &lt;code&gt;bigint&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1234&lt;/span&gt;&lt;span style="color:#e06c75"&gt;n&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// bigint
&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;b&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;5678&lt;/span&gt;&lt;span style="color:#e06c75"&gt;n&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// 5678n
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;e&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;88.5&lt;/span&gt;&lt;span style="color:#e06c75"&gt;n&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS1353: un literal bigint debe ser entero.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;h&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bigint&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2322: &amp;#39;100&amp;#39; no es asignable a &amp;#39;bigint&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="string"&gt;string&lt;/h2&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// string
&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;c&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 style="color:#7f848e"&gt;// &amp;#39;!&amp;#39; (literal)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;e&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;zoom&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;f&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;john&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;john&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// &amp;#39;john&amp;#39; (literal)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;g&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;john&amp;#39;&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;zoe&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2322
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="symbol"&gt;symbol&lt;/h2&gt;
&lt;p&gt;Un &lt;code&gt;symbol&lt;/code&gt; representa un identificador único. Se crea con &lt;code&gt;Symbol()&lt;/code&gt; y admite una descripción opcional útil para depurar:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;id&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Symbol&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;); &lt;span style="color:#7f848e"&gt;// symbol con descripción &amp;#34;id&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La garantía clave: &lt;strong&gt;dos símbolos nunca son iguales&lt;/strong&gt;, aunque compartan descripción. La descripción es solo una etiqueta sin efecto sobre la identidad.&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;id1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Symbol&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;id2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Symbol&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#34;id&amp;#34;&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:#e06c75"&gt;id1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#e06c75"&gt;id2&lt;/span&gt;); &lt;span style="color:#7f848e"&gt;// false
&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;d&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;id1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;x&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2469: el operador &amp;#39;+&amp;#39; no aplica a &amp;#39;symbol&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="objetos"&gt;Objetos&lt;/h2&gt;
&lt;p&gt;Hay dos formas de tipar objetos. La primera usa la palabra clave &lt;code&gt;object&lt;/code&gt;, que solo garantiza que el valor no es &lt;code&gt;null&lt;/code&gt; pero &lt;strong&gt;no expone sus propiedades&lt;/strong&gt;, porque TypeScript no sabe qué objeto es:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;object&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;x&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// a.b // Error: la propiedad &amp;#39;b&amp;#39; no existe en el tipo &amp;#39;object&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La segunda —y recomendada— describe la forma exacta del objeto:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;c&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;firstName&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 style="color:#e06c75"&gt;lastName&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 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;firstName&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;john&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;lastName&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;barrowman&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;Las definiciones de objeto admiten campos opcionales (&lt;code&gt;?&lt;/code&gt;), índices dinámicos y propiedades de solo lectura:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&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;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// obligatorio, number
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;c?&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// opcional, string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e06c75"&gt;key&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;]&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// cualquier clave numérica → boolean
&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;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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;user&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:#c678dd"&gt;readonly&lt;/span&gt; &lt;span style="color:#e06c75"&gt;firstName&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 style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;firstName&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;abby&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;user&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;firstName&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;abbey&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// Error TS2540: propiedad de solo lectura.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Evita tipar con el objeto vacío &lt;code&gt;{}&lt;/code&gt;. Acepta cualquier valor distinto de &lt;code&gt;null&lt;/code&gt; o &lt;code&gt;undefined&lt;/code&gt; (incluso números o arreglos), lo que vacía de sentido la anotación.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="alias-de-tipo"&gt;Alias de tipo&lt;/h2&gt;
&lt;p&gt;Los alias asignan un nombre semántico a un tipo, mejorando la legibilidad sin alterar la verificació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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Age&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;number&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Person&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;name&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 style="color:#e06c75"&gt;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Age&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;driver&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Person&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;name&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;James May&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;age&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;55&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;Como &lt;code&gt;Age&lt;/code&gt; es solo un alias de &lt;code&gt;number&lt;/code&gt;, sigue siendo compatible con cualquier &lt;code&gt;number&lt;/code&gt;. Ten presente que un alias &lt;strong&gt;solo puede declararse una vez&lt;/strong&gt; por ámbito; aplica las mismas reglas de &lt;em&gt;shadowing&lt;/em&gt; que &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;const&lt;/code&gt; y &lt;code&gt;var&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="tipos-unión-e-intersección"&gt;Tipos unión e intersección&lt;/h2&gt;
&lt;p&gt;Recurriendo a la teoría de conjuntos: la &lt;strong&gt;unión&lt;/strong&gt; (&lt;code&gt;|&lt;/code&gt;) admite uno u otro tipo —o ambos—, mientras que la &lt;strong&gt;intersección&lt;/strong&gt; (&lt;code&gt;&amp;amp;&lt;/code&gt;) exige cumplir simultáneamente todas las formas combinadas.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 subgraph Union["A | B"]
 U[Cualquier valor que sea A, B o ambos]
 end
 subgraph Inter["A &amp; B"]
 I[Solo valores que cumplen A y B a la vez]
 end
&lt;/pre&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Cat&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;purrs&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Dog&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;name&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;barks&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;wags&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&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;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CatOrDogOrBoth&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Cat&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Dog&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// unión
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;type&lt;/span&gt; &lt;span style="color:#e06c75"&gt;CatAndDog&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Cat&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Dog&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// intersección
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un valor &lt;code&gt;Cat | Dog&lt;/code&gt; puede ser un gato, un perro o un objeto que cumpla ambas formas. Un valor &lt;code&gt;Cat &amp;amp; Dog&lt;/code&gt;, en cambio, está obligado a tener &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;purrs&lt;/code&gt;, &lt;code&gt;barks&lt;/code&gt; y &lt;code&gt;wags&lt;/code&gt; al mismo tiempo.&lt;/p&gt;
&lt;h2 id="arreglos"&gt;Arreglos&lt;/h2&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&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:#7f848e"&gt;// number[]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;d&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:#98c379"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;] &lt;span style="color:#7f848e"&gt;// (string | number)[]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;h&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&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;h&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;push&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// OK
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;h&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;push&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;red&amp;#39;&lt;/span&gt;) &lt;span style="color:#7f848e"&gt;// Error TS2345
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un arreglo declarado vacío sin anotación arranca como &lt;code&gt;any[]&lt;/code&gt; y va ampliando su tipo según lo que insertes —otra razón para anotar explícitamente las colecciones en las fronteras del sistema.&lt;/p&gt;
&lt;h2 id="tuplas"&gt;Tuplas&lt;/h2&gt;
&lt;p&gt;Las tuplas son un subconjunto de los arreglos con &lt;strong&gt;longitud fija&lt;/strong&gt; y tipos posicionales:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#e5c07b"&gt;number&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 style="color:#7f848e"&gt;// [nombre, apellido, año de nacimiento]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;malcolm&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;gladwell&amp;#39;&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1963&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;b&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#39;queen&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;elizabeth&amp;#39;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#39;ii&amp;#39;&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1926&lt;/span&gt;] &lt;span style="color:#7f848e"&gt;// Error TS2322: posición/longitud inválida
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También admiten posiciones opcionales:&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:#7f848e"&gt;// Tarifas de tren que a veces varían según la dirección
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;trainFares&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; [&lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;number&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;?&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:#d19a66"&gt;3.75&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#d19a66"&gt;8.25&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;7.70&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#d19a66"&gt;10.50&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;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El sistema de tipos de TypeScript va mucho más allá de etiquetar variables: distingue entre &lt;code&gt;any&lt;/code&gt; (inseguro) y &lt;code&gt;unknown&lt;/code&gt; (seguro), modela estados exactos con tipos literales, compone formas mediante uniones e intersecciones y garantiza estructuras rígidas con tuplas. Dominar este catálogo es el prerrequisito para los temas avanzados de la serie.&lt;/p&gt;
&lt;p&gt;En el siguiente artículo aplicaremos estos fundamentos a los &lt;strong&gt;objetos y tipos personalizados&lt;/strong&gt;, donde los alias de tipo se vuelven el centro del diseño.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Transiciones, transformaciones y rendimiento</title><link>https://blog.dacadev.com/programacion/estilos-css/transiciones-y-transformaciones/</link><pubDate>Sun, 14 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/transiciones-y-transformaciones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las transiciones y transformaciones en CSS: timing functions, las funciones transform (scale, rotate, translate, skew), perspectiva 3D y el pipeline de render.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/07-transiciones-y-transformaciones-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="#transiciones"&gt;Transiciones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#timing-functions"&gt;Timing functions&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#transformaciones"&gt;Transformaciones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#rotación"&gt;Rotación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#traslación"&gt;Traslación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#escala"&gt;Escala&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#inclinación"&gt;Inclinación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#punto-de-referencia-transform-origin"&gt;Punto de referencia: transform-origin&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinar-transformaciones"&gt;Combinar transformaciones&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-pipeline-de-renderizado"&gt;El pipeline de renderizado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#transformaciones-en-3d"&gt;Transformaciones en 3D&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;Las transiciones y transformaciones son la puerta de entrada a las interfaces animadas. Una transición suaviza el cambio entre dos estados; una transformación altera la geometría visual de un elemento sin afectar el layout. Bien aplicadas, mejoran la percepción de calidad y guían la atención del usuario. Mal aplicadas, generan &lt;em&gt;jank&lt;/em&gt; y consumen batería. La diferencia está en entender qué propiedades son baratas de animar y por qué.&lt;/p&gt;
&lt;p&gt;Esta es la séptima entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Cubriremos la propiedad &lt;code&gt;transition&lt;/code&gt; y sus &lt;em&gt;timing functions&lt;/em&gt;, las funciones de &lt;code&gt;transform&lt;/code&gt; en 2D y 3D, y el pipeline de renderizado que explica por qué &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt; son las propiedades óptimas para animar.&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;Aprenderás a construir transiciones fluidas con curvas de Bézier, a aplicar y combinar transformaciones, y a entender el pipeline layout → paint → composición para escribir animaciones eficientes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transiciones"&gt;Transiciones&lt;/h2&gt;
&lt;p&gt;Una transición interpola el cambio de una propiedad entre su valor inicial y final a lo largo del tiempo. Suele combinarse con pseudo-clases como &lt;code&gt;:hover&lt;/code&gt; o &lt;code&gt;:active&lt;/code&gt;. Se controla con cuatro propiedades:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-property&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;background-color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;transform&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;transition-duration&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;.&lt;span style="color:#e5c07b"&gt;3s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;.&lt;span style="color:#e5c07b"&gt;6s&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;transition-timing-function&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ease&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;linear&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;transition-delay&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;100ms&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-property&lt;/code&gt;&lt;/strong&gt; — qué propiedades se animan (usa &lt;code&gt;all&lt;/code&gt; para todas).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-duration&lt;/code&gt;&lt;/strong&gt; — cuánto dura la interpolación.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-timing-function&lt;/code&gt;&lt;/strong&gt; — cómo se distribuye el movimiento en el tiempo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-delay&lt;/code&gt;&lt;/strong&gt; — cuánto espera antes de empezar (opcional).&lt;/li&gt;
&lt;/ul&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .cstrans { padding:.8em 1.6em; border:0; color:#fff; border-radius:.5em; cursor:pointer; background:#2a9da9; transition:background-color .3s ease, transform .3s ease, box-shadow .3s ease; box-shadow:0 .15em .4em rgba(0,0,0,.2); }
 .cstrans:hover { background:#16828d; transform:translateY(-4px); box-shadow:0 .4em .8em rgba(0,0,0,.3); }
 &lt;/style&gt;
 &lt;button class="cstrans" type="button"&gt;Pasa el cursor sobre mí&lt;/button&gt;
&lt;/div&gt;
&lt;h3 id="timing-functions"&gt;Timing functions&lt;/h3&gt;
&lt;p&gt;La &lt;em&gt;timing function&lt;/em&gt; define cómo se reparte el movimiento en el tiempo. Existen valores predefinidos —&lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;ease&lt;/code&gt;, &lt;code&gt;ease-in&lt;/code&gt;, &lt;code&gt;ease-out&lt;/code&gt;, &lt;code&gt;ease-in-out&lt;/code&gt;— donde el eje X representa el tiempo y el eje Y el progreso del cambio.&lt;/p&gt;
&lt;p&gt;Todas son &lt;strong&gt;curvas de Bézier&lt;/strong&gt;, y puedes definir la tuya con la función &lt;code&gt;cubic-bezier()&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;cubic-bezier&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0.45&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.05&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.55&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.95&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También puedes hacer el cambio en pasos discretos con &lt;code&gt;steps()&lt;/code&gt;, útil para animaciones tipo sprite o efectos de &amp;ldquo;tecleo&amp;rdquo;:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;all&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;steps&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;3&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Existen editores visuales de curvas de Bézier que te permiten ajustar la animación y copiar el valor exacto. Experimentar con ellos es la forma más rápida de afinar la sensación de una transición.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transformaciones"&gt;Transformaciones&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;transform&lt;/code&gt; altera la geometría visual de un elemento mediante cuatro operaciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scale()&lt;/code&gt;&lt;/strong&gt; — escala el tamaño.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rotate()&lt;/code&gt;&lt;/strong&gt; — rota el elemento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;translate()&lt;/code&gt;&lt;/strong&gt; — lo desplaza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;skew()&lt;/code&gt;&lt;/strong&gt; — lo inclina/estira.&lt;/li&gt;
&lt;/ul&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;Las transformaciones solo alteran la representación visual del elemento, &lt;strong&gt;no su comportamiento en el layout&lt;/strong&gt;. El hueco original que ocupaba se conserva, y los elementos vecinos no se reorganizan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="rotación"&gt;Rotación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rotate()&lt;/code&gt; gira el elemento. Los valores positivos giran en sentido horario; los negativos, antihorario.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;giro&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;15&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="traslación"&gt;Traslación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;translate(x, y)&lt;/code&gt; mueve el elemento en ambos ejes sin afectar el flujo. Los valores positivos lo desplazan a la derecha y hacia abajo.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;mover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;40&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="escala"&gt;Escala&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;scale()&lt;/code&gt; redimensiona: valores entre 0 y 1 encogen, mayores que 1 agrandan.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;crecer&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.3&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="inclinación"&gt;Inclinación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skew(x, y)&lt;/code&gt; deforma el elemento inclinándolo respecto a los ejes.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;inclinar&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;skew&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;justify-content:center;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:rotate(15deg);display:inline-block;"&gt;rotate&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:translate(0,-8px);display:inline-block;"&gt;translate&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:scale(1.25);display:inline-block;"&gt;scale&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:skew(-12deg);display:inline-block;"&gt;skew&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="punto-de-referencia-transform-origin"&gt;Punto de referencia: transform-origin&lt;/h3&gt;
&lt;p&gt;Toda transformación se aplica desde un punto de referencia, que por defecto es el centro del elemento. &lt;code&gt;transform-origin&lt;/code&gt; lo reubica:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;giro&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform-origin&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* equivale a 0% 50% */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="combinar-transformaciones"&gt;Combinar transformaciones&lt;/h3&gt;
&lt;p&gt;Puedes encadenar varias funciones separándolas por espacios. &lt;strong&gt;Se aplican de derecha a izquierda&lt;/strong&gt;, lo que afecta el resultado final:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;15&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;) &lt;span style="color:#e5c07b"&gt;translate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="el-pipeline-de-renderizado"&gt;El pipeline de renderizado&lt;/h2&gt;
&lt;p&gt;Para escribir animaciones eficientes hay que entender cómo el navegador dibuja una página. El proceso tiene tres etapas clave:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt; — el navegador calcula las dimensiones y posiciones de todos los elementos. Cualquier cambio de tamaño o posición dispara un recálculo completo (&lt;em&gt;reflow&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paint&lt;/strong&gt; — pinta en memoria los píxeles de cada elemento (colores, bordes, sombras), posiblemente en capas separadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Composición&lt;/strong&gt; — combina las capas pintadas para mostrarlas en pantalla.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[JS / CSS] --&gt; B[Layout]
 B --&gt; C[Paint]
 C --&gt; D[Composición]
&lt;/pre&gt;

&lt;p&gt;La clave del rendimiento: algunas propiedades, como &lt;strong&gt;&lt;code&gt;transform&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;opacity&lt;/code&gt;&lt;/strong&gt;, solo afectan la etapa de &lt;strong&gt;composición&lt;/strong&gt;. No requieren recalcular el layout ni repintar, por lo que son las propiedades óptimas para animar de forma fluida a 60 fps.&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;Prefiere animar &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt; en lugar de &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt; o &lt;code&gt;left&lt;/code&gt;. Estas últimas disparan layout y paint en cada frame, lo que produce animaciones entrecortadas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transformaciones-en-3d"&gt;Transformaciones en 3D&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;transform&lt;/code&gt; también opera en tres dimensiones. Puedes rotar sobre cualquier eje con &lt;code&gt;rotateX()&lt;/code&gt;, &lt;code&gt;rotateY()&lt;/code&gt; y &lt;code&gt;rotateZ()&lt;/code&gt;. El efecto depende de la &lt;strong&gt;perspectiva&lt;/strong&gt;: la distancia simulada entre el observador y el elemento. A menor perspectiva, más pronunciado el efecto 3D.&lt;/p&gt;
&lt;p&gt;Hay dos formas de aplicarla:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* 1. Función dentro de transform (afecta solo a ese elemento) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;perspective&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;) &lt;span style="color:#e5c07b"&gt;rotateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;30&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&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:#7f848e"&gt;/* 2. Propiedad en el contenedor (perspectiva compartida) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;row&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;perspective&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;30&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;justify-content:center;gap:2rem;perspective:300px;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em 1em;border-radius:.4em;transform:rotateX(35deg);"&gt;rotateX(35deg)&lt;/div&gt;
 &lt;div style="background:#16828d;color:#fff;padding:1.5em 1em;border-radius:.4em;transform:rotateY(35deg);"&gt;rotateY(35deg)&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Una rotación de 180° voltea el elemento como un espejo. La propiedad &lt;code&gt;backface-visibility&lt;/code&gt; controla si la cara trasera es visible, lo que habilita efectos como las tarjetas que se voltean. Un recurso clásico para profundizar es &lt;a href="https://3dtransforms.desandro.com/card-flip"




 target="_blank"
 


&gt;Intro to CSS 3D transforms&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las transiciones suavizan los cambios de estado y las transformaciones manipulan la geometría sin tocar el layout. La regla de oro del rendimiento es animar &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;, que solo afectan la etapa de composición. Con curvas de Bézier afinadas y un uso consciente del pipeline, tus animaciones serán fluidas y eficientes.&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;🚀 La entrega final de la serie aborda la &lt;strong&gt;modularización y los patrones de diseño&lt;/strong&gt; en CSS: cómo organizar tus estilos en componentes mantenibles con metodologías como BEM.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>TypeScript: Introducción y configuración del entorno</title><link>https://blog.dacadev.com/programacion/typescript/introduccion-a-typescript/</link><pubDate>Sun, 14 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/typescript/introduccion-a-typescript/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende qué es TypeScript, cómo funciona su compilador, cómo instalarlo y configurar tsconfig.json para iniciar un proyecto profesional con tipado estático.</description><media:content url="https://blog.dacadev.com/images/programming/typescript/introduction/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="#cómo-se-ejecuta-el-código-ast-bytecode-y-runtime"&gt;¿Cómo se ejecuta el código? AST, bytecode y runtime&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-sistema-de-tipos"&gt;El sistema de tipos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#instalación-de-typescript"&gt;Instalación de TypeScript&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tsconfigjson-el-corazón-de-la-configuración"&gt;tsconfig.json: el corazón de la configuración&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-archivo-de-entrada-indexts"&gt;El archivo de entrada: index.ts&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#hola-mundo-y-la-verificación-de-tipos-en-acción"&gt;Hola mundo y la verificación de tipos en acción&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#watch-mode-compilación-continua"&gt;Watch mode: compilación continua&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;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 abre la serie sobre &lt;strong&gt;TypeScript&lt;/strong&gt;. Aquí analizaremos qué problema resuelve el tipado estático, cómo opera el compilador &lt;code&gt;tsc&lt;/code&gt; y cómo dejar listo un proyecto profesional con &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;JavaScript resuelve los tipos en tiempo de ejecución. Esto significa que un error tan trivial como pasar un &lt;code&gt;string&lt;/code&gt; donde se esperaba un &lt;code&gt;number&lt;/code&gt; solo se manifiesta cuando el código ya está corriendo, frecuentemente en producción y bajo la forma de un &lt;code&gt;NaN&lt;/code&gt; silencioso o una excepción difícil de rastrear. &lt;strong&gt;TypeScript&lt;/strong&gt; ataca este problema en la raíz: agrega un sistema de tipos estático sobre JavaScript que traslada la detección de errores desde el runtime hacia el tiempo de compilación.&lt;/p&gt;
&lt;h2 id="cómo-se-ejecuta-el-código-ast-bytecode-y-runtime"&gt;¿Cómo se ejecuta el código? AST, bytecode y runtime&lt;/h2&gt;
&lt;p&gt;Para entender qué aporta TypeScript conviene recordar el ciclo de vida de un programa en un motor de JavaScript:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El programa se parsea hacia un &lt;strong&gt;AST&lt;/strong&gt; (Abstract Syntax Tree).&lt;/li&gt;
&lt;li&gt;El AST se compila a &lt;strong&gt;bytecode&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;El bytecode es evaluado por el &lt;strong&gt;runtime&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;TypeScript se inserta antes de este flujo. El compilador &lt;code&gt;tsc&lt;/code&gt; toma tu código &lt;code&gt;.ts&lt;/code&gt;, construye su propio AST, lo somete al &lt;strong&gt;typechecker&lt;/strong&gt; y, si todo es válido, emite JavaScript estándar que cualquier motor puede ejecutar.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[Código TypeScript] --&gt; B[AST de TypeScript]
 B --&gt; C{Typechecker}
 C -- válido --&gt; D[JavaScript emitido]
 C -- error --&gt; E[Error en compilación]
 D --&gt; F[AST de JavaScript]
 F --&gt; G[Bytecode]
 G --&gt; H[Runtime]
&lt;/pre&gt;

&lt;p&gt;La conclusión clave: el typechecker es una capa de verificación que se ejecuta &lt;strong&gt;antes&lt;/strong&gt; de generar el JavaScript final. Los errores de tipo nunca llegan al runtime porque la compilación se detiene antes.&lt;/p&gt;
&lt;h2 id="el-sistema-de-tipos"&gt;El sistema de tipos&lt;/h2&gt;
&lt;p&gt;TypeScript admite tanto anotaciones de tipo explícitas como inferencia automática. Ambas estrategias coexisten en el mismo archivo:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;number&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:#7f848e"&gt;// a es number
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// b es string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;c&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt;[] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;] &lt;span style="color:#7f848e"&gt;// c es un arreglo de booleanos
&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;a&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:#7f848e"&gt;// a es number (inferido)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;b&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span style="color:#7f848e"&gt;// b es string (inferido)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;c&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;] &lt;span style="color:#7f848e"&gt;// c es boolean[] (inferido)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Apóyate en la inferencia siempre que el tipo sea evidente y reserva las anotaciones explícitas para las fronteras del sistema: firmas de funciones, APIs públicas y estructuras de datos compartidas. Esto reduce el ruido sin sacrificar seguridad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La diferencia esencial frente a JavaScript se resume así:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Característica del sistema de tipos&lt;/th&gt;
 &lt;th&gt;JavaScript&lt;/th&gt;
 &lt;th&gt;TypeScript&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;¿Cómo se enlazan los tipos?&lt;/td&gt;
 &lt;td&gt;Dinámicamente&lt;/td&gt;
 &lt;td&gt;Estáticamente&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;¿Se convierten automáticamente?&lt;/td&gt;
 &lt;td&gt;Sí&lt;/td&gt;
 &lt;td&gt;No (en general)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;¿Cuándo se verifican?&lt;/td&gt;
 &lt;td&gt;En tiempo de ejecución&lt;/td&gt;
 &lt;td&gt;En tiempo de compilación&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;¿Cuándo afloran los errores?&lt;/td&gt;
 &lt;td&gt;En ejecución&lt;/td&gt;
 &lt;td&gt;En compilación&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="instalación-de-typescript"&gt;Instalación de TypeScript&lt;/h2&gt;
&lt;p&gt;TypeScript se distribuye como un paquete de Node, por lo que necesitas tener &lt;strong&gt;Node.js&lt;/strong&gt; instalado. Inicializa el proyecto y agrega las dependencias de desarrollo:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm init -y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install --save-dev typescript @types/node
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;@types/node&lt;/code&gt; aporta las definiciones de tipos del entorno de ejecución de Node, indispensables si vas a trabajar en el backend.&lt;/p&gt;
&lt;h2 id="tsconfigjson-el-corazón-de-la-configuración"&gt;tsconfig.json: el corazón de la configuración&lt;/h2&gt;
&lt;p&gt;El archivo &lt;code&gt;tsconfig.json&lt;/code&gt;, ubicado en la raíz del proyecto, define cómo el compilador interpreta y transforma tu código. Una configuración base sólida luce así:&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-json" data-lang="json"&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;&amp;#34;compilerOptions&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;lib&amp;#34;&lt;/span&gt;: [&lt;span style="color:#98c379"&gt;&amp;#34;es2015&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;module&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;commonjs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;outDir&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;dist&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;sourceMap&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;strict&amp;#34;&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;&amp;#34;target&amp;#34;&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;es2015&amp;#34;&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;&amp;#34;include&amp;#34;&lt;/span&gt;: [&lt;span style="color:#98c379"&gt;&amp;#34;src&amp;#34;&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;Cada opción cumple un rol concreto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;include&lt;/code&gt;: indica las rutas donde &lt;code&gt;tsc&lt;/code&gt; debe buscar los archivos a compilar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lib&lt;/code&gt;: declara qué librerías de tipos (APIs del entorno) asume disponibles el proyecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt;: define el sistema de módulos del código emitido (&lt;code&gt;commonjs&lt;/code&gt;, &lt;code&gt;esnext&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;outDir&lt;/code&gt;: ubicación de los archivos JavaScript compilados.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sourceMap&lt;/code&gt;: genera &lt;em&gt;source maps&lt;/em&gt; para depurar el TypeScript original desde el navegador o Node.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strict&lt;/code&gt;: habilita el conjunto completo de comprobaciones estrictas. Es la opción que más valor aporta.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;target&lt;/code&gt;: versión de JavaScript a la que se transpila el código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puedes consultar el catálogo completo de opciones en la &lt;a href="https://www.typescriptlang.org/docs/handbook/compiler-options.html"




 target="_blank"
 


&gt;documentación oficial de tsc&lt;/a&gt;, o explorarlas desde la terminal:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx tsc --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;La opción &lt;code&gt;strict&lt;/code&gt; no es opcional en un proyecto serio. Activarla desde el primer commit evita una migración dolorosa más adelante, cuando el código ya arrastra cientos de tipos implícitos &lt;code&gt;any&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="el-archivo-de-entrada-indexts"&gt;El archivo de entrada: index.ts&lt;/h2&gt;
&lt;p&gt;El punto de entrada convencional es &lt;code&gt;src/index.ts&lt;/code&gt;. Comencemos con el clásico mensaje de prueba:&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:#e06c75"&gt;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#98c379"&gt;&amp;#39;hello world from TS!&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Compila el proyecto y ejecútalo:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx tsc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node ./dist/index.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tsc&lt;/code&gt; lee la configuración de &lt;code&gt;tsconfig.json&lt;/code&gt;, transpila todo lo que esté bajo &lt;code&gt;src&lt;/code&gt; y deposita el resultado en &lt;code&gt;dist&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="hola-mundo-y-la-verificación-de-tipos-en-acción"&gt;Hola mundo y la verificación de tipos en acción&lt;/h2&gt;
&lt;p&gt;Observemos cómo el typechecker protege contra asignaciones inválidas:&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;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;msg&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Hola mundo&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;David Casas&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;// msg = 123 // Error: number no es asignable a string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al compilar, TypeScript transpila a JavaScript plano eliminando las anotaciones:&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-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;var&lt;/span&gt; &lt;span style="color:#e06c75"&gt;msg&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;Hola mundo&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#39;David Casas&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;console&lt;/span&gt;.&lt;span style="color:#e06c75"&gt;log&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;msg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El tipo &lt;code&gt;string&lt;/code&gt; desaparece del código emitido porque su único propósito era validar en compilación. Esta propiedad —los tipos se borran tras la verificación— se conoce como &lt;em&gt;type erasure&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="watch-mode-compilación-continua"&gt;Watch mode: compilación continua&lt;/h2&gt;
&lt;p&gt;Compilar manualmente tras cada cambio rompe el flujo de trabajo. El compilador incluye un &lt;strong&gt;modo observador&lt;/strong&gt; que recompila de forma incremental cada vez que detecta una modificació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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx tsc --watch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# o su forma corta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx tsc -w
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mantén este proceso abierto en una terminal mientras desarrollas: cada vez que guardes un archivo &lt;code&gt;.ts&lt;/code&gt;, verás de inmediato los errores de tipo o la salida actualizada en &lt;code&gt;dist&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;TypeScript no reemplaza a JavaScript; lo eleva añadiendo una capa de verificación estática que captura errores antes de ejecutar una sola línea. Con Node instalado, un &lt;code&gt;tsconfig.json&lt;/code&gt; en modo &lt;code&gt;strict&lt;/code&gt; y el compilador en &lt;em&gt;watch mode&lt;/em&gt;, ya tienes un entorno profesional listo para los siguientes temas de la serie.&lt;/p&gt;
&lt;p&gt;En el próximo artículo profundizaremos en los &lt;strong&gt;tipos básicos&lt;/strong&gt; del lenguaje: &lt;code&gt;any&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;, objetos, uniones e intersecciones.&lt;/p&gt;</content:encoded></item><item><title>Estilos CSS: Fondos, gradientes y sombras</title><link>https://blog.dacadev.com/programacion/estilos-css/backgrounds-y-sombras/</link><pubDate>Fri, 12 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/backgrounds-y-sombras/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a trabajar con fondos en CSS: las propiedades background, gradientes lineales y radiales, modos de mezcla y sombras con box-shadow y text-shadow.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/06-backgrounds-y-sombras-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="#la-familia-background"&gt;La familia background&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#gradientes-lineales"&gt;Gradientes lineales&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#gradientes-lineales-repetitivos"&gt;Gradientes lineales repetitivos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#gradientes-radiales"&gt;Gradientes radiales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinar-múltiples-fondos"&gt;Combinar múltiples fondos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#texturas-con-blend-modes"&gt;Texturas con blend modes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#sombras-box-shadow-y-text-shadow"&gt;Sombras: box-shadow y text-shadow&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sombras-interiores-para-feedback"&gt;Sombras interiores para feedback&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&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;Los fondos y las sombras son las herramientas con las que CSS aporta profundidad, textura y jerarquía visual sin necesidad de imágenes externas. Un gradiente bien construido reemplaza un archivo PNG; una sombra sutil comunica que un botón es interactivo. Dominar estas propiedades te permite crear interfaces ricas con código puro, ligero y escalable.&lt;/p&gt;
&lt;p&gt;Esta es la sexta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos la familia de propiedades &lt;code&gt;background&lt;/code&gt;, los gradientes lineales y radiales, los modos de mezcla y las sombras de caja y de texto.&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;Aprenderás a generar gradientes y patrones sin imágenes, a combinar varias capas de fondo y a usar &lt;code&gt;box-shadow&lt;/code&gt; y &lt;code&gt;text-shadow&lt;/code&gt; para dar realismo y feedback a tus componentes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-familia-background"&gt;La familia background&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;background&lt;/code&gt; es una propiedad abreviada que agrupa ocho propiedades individuales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;background-image&lt;/code&gt; — una imagen o un gradiente generado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-position&lt;/code&gt; — la posición inicial del fondo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-size&lt;/code&gt; — el tamaño de renderizado (&lt;code&gt;cover&lt;/code&gt;, &lt;code&gt;contain&lt;/code&gt;, valores explícitos).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-repeat&lt;/code&gt; — si la imagen se repite en mosaico.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-origin&lt;/code&gt; — respecto a qué caja se posiciona (border, padding o content).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-clip&lt;/code&gt; — hasta qué caja se extiende el fondo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-attachment&lt;/code&gt; — si el fondo se desplaza con el contenido o queda fijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-color&lt;/code&gt; — un color sólido que se renderiza detrás de la imagen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gradientes-lineales"&gt;Gradientes lineales&lt;/h2&gt;
&lt;p&gt;Un gradiente es una transición de colores generada por una función de CSS, sin archivos. &lt;code&gt;linear-gradient()&lt;/code&gt; crea una transición a lo largo de una direcció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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;fade&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;right&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:80px;border-radius:.4em;background-image:linear-gradient(to right,#fff,#2a9da9);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La función acepta una dirección (&lt;code&gt;to right&lt;/code&gt;, &lt;code&gt;90deg&lt;/code&gt;, etc.) y una lista de colores. Puedes incluir más de dos colores y fijar su posición con porcentajes:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;fade&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;90&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt; &lt;span style="color:#d19a66"&gt;50&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:80px;border-radius:.4em;background-image:linear-gradient(90deg,#c0392b 0%,#fff 50%,#2a9da9 100%);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="gradientes-lineales-repetitivos"&gt;Gradientes lineales repetitivos&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;repeating-linear-gradient()&lt;/code&gt; crea patrones que se repiten, útil para texturas como rayas:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;rayas&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;repeating-linear-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-45&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt; &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:50px;border-radius:.4em;background-image:repeating-linear-gradient(-45deg,#2a9da9,#2a9da9 10px,#16828d 10px,#16828d 20px);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="gradientes-radiales"&gt;Gradientes radiales&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;radial-gradient()&lt;/code&gt; genera una transición circular o elíptica que irradia desde un punto, en lugar de seguir una dirección lineal.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;brillo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;radial-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:120px;border-radius:.4em;background-image:radial-gradient(circle,#fff,#2a9da9);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="combinar-múltiples-fondos"&gt;Combinar múltiples fondos&lt;/h2&gt;
&lt;p&gt;Puedes apilar varias capas de fondo separándolas con comas. La primera capa queda al frente. Esto permite, por ejemplo, superponer un gradiente sobre una imagen:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;heroe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bottom&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;42&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;157&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;169&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;), &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;22&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;130&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;141&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.9&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;foto.jpg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-size&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;cover&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:120px;border-radius:.4em;display:flex;align-items:center;justify-content:center;color:#fff;font-family:Helvetica,Arial,sans-serif;font-weight:bold;background-image:linear-gradient(135deg,rgba(42,157,169,.85),rgba(22,130,141,.95)),repeating-linear-gradient(45deg,#888,#888 8px,#777 8px,#777 16px);"&gt;Gradiente sobre una textura de fondo&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="texturas-con-blend-modes"&gt;Texturas con blend modes&lt;/h3&gt;
&lt;p&gt;La propiedad &lt;code&gt;background-blend-mode&lt;/code&gt; mezcla las capas de fondo entre sí (con modos como &lt;code&gt;multiply&lt;/code&gt;, &lt;code&gt;soft-light&lt;/code&gt;, &lt;code&gt;overlay&lt;/code&gt;), añadiendo textura a una imagen sin editarla en un programa externo:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;textura&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;rayones.png&lt;/span&gt;), &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;foto.jpg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-blend-mode&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;soft-light&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;h2 id="sombras-box-shadow-y-text-shadow"&gt;Sombras: box-shadow y text-shadow&lt;/h2&gt;
&lt;p&gt;CSS permite añadir sombras tanto a las cajas (&lt;code&gt;box-shadow&lt;/code&gt;) como al texto (&lt;code&gt;text-shadow&lt;/code&gt;). Ambas reciben los mismos parámetros básicos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desplazamiento horizontal y vertical (&lt;code&gt;offset-x&lt;/code&gt;, &lt;code&gt;offset-y&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El radio de difuminado (&lt;code&gt;blur&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;(opcional) El radio de expansión (&lt;code&gt;spread&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El color de la sombra.&lt;/li&gt;
&lt;/ol&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.25&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#f4f6f7;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;"&gt;
 &lt;div style="background:#fff;color:#111;padding:1.2em 1.5em;border-radius:.5em;box-shadow:0 .2em .5em rgba(0,0,0,.25);"&gt;Tarjeta con &lt;code&gt;box-shadow&lt;/code&gt;&lt;/div&gt;
 &lt;span style="font-size:1.6rem;font-weight:bold;color:#2a9da9;text-shadow:2px 2px 4px rgba(0,0,0,.4);"&gt;Texto con text-shadow&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="sombras-interiores-para-feedback"&gt;Sombras interiores para feedback&lt;/h3&gt;
&lt;p&gt;La palabra clave &lt;code&gt;inset&lt;/code&gt; convierte la sombra en interior, perfecta para simular que un botón está presionado. Combinada con pseudo-clases como &lt;code&gt;:active&lt;/code&gt;, crea componentes con feedback táctil:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bottom&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&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:#e5c07b"&gt;boton&lt;/span&gt;:&lt;span style="color:#61afef"&gt;active&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inset&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;#0d4f56&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;inset&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.4&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .csbtn { padding:1em 1.5em; border:0; font-size:.9rem; color:#fff; border-radius:.5em; cursor:pointer; background-image:linear-gradient(to bottom,#2a9da9,#16828d); box-shadow:.1em .1em .5em rgba(0,0,0,.4); }
 .csbtn:active { box-shadow:inset 0 0 .5em #0d4f56, inset 0 .5em 1em rgba(0,0,0,.4); }
 &lt;/style&gt;
 &lt;button class="csbtn" type="button"&gt;Mantén presionado este botón&lt;/button&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Al pulsarlo, la sombra interior simula el hundido físico.&lt;/p&gt;
&lt;/div&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;Las sombras se renderizan en la capa de composición y son baratas de animar. Una transición sutil de &lt;code&gt;box-shadow&lt;/code&gt; en &lt;code&gt;:hover&lt;/code&gt; comunica interactividad con un costo de rendimiento mínimo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los gradientes y las sombras te permiten construir interfaces con profundidad y textura usando solo CSS, evitando peticiones de red y archivos de imagen. Apilar capas de fondo, mezclarlas con blend modes y aplicar sombras interiores son técnicas que elevan la calidad visual de cualquier componente.&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;🚀 La próxima entrega cubre &lt;strong&gt;transiciones y transformaciones&lt;/strong&gt;: cómo animar cambios de estado de forma fluida y manipular la geometría de los elementos con &lt;code&gt;transform&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Posicionamiento, z-index y diseño responsive</title><link>https://blog.dacadev.com/programacion/estilos-css/posicionamiento-y-responsive/</link><pubDate>Wed, 10 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/posicionamiento-y-responsive/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina el posicionamiento en CSS: static, relative, absolute, fixed y sticky, los contextos de apilamiento con z-index y el diseño responsive con media queries.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/05-posicionamiento-y-responsive-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="#la-propiedad-position"&gt;La propiedad position&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fixed-anclado-al-viewport"&gt;Fixed: anclado al viewport&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#absolute-relativo-al-ancestro-posicionado"&gt;Absolute: relativo al ancestro posicionado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#relative-desplazamiento-sin-salir-del-flujo"&gt;Relative: desplazamiento sin salir del flujo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#sticky-lo-mejor-de-relative-y-fixed"&gt;Sticky: lo mejor de relative y fixed&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#stacking-contexts-y-z-index"&gt;Stacking contexts y z-index&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#responsive-estilos-que-se-adaptan"&gt;Responsive: estilos que se adaptan&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#media-queries"&gt;Media queries&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#breakpoints-con-mobile-first"&gt;Breakpoints con mobile first&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estilos-para-impresión"&gt;Estilos para impresión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&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;Hasta ahora hemos trabajado con elementos que viven en el flujo normal del documento. El posicionamiento rompe ese flujo: te permite anclar una cabecera al viewport, superponer un modal, desplegar un menú o fijar una barra lateral mientras el usuario hace scroll. Combinado con &lt;code&gt;z-index&lt;/code&gt; y las media queries, el posicionamiento es la base de las interacciones dinámicas y del diseño adaptable.&lt;/p&gt;
&lt;p&gt;Esta es la quinta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Cubriremos los cinco valores de &lt;code&gt;position&lt;/code&gt;, los contextos de apilamiento con &lt;code&gt;z-index&lt;/code&gt; y los fundamentos del diseño &lt;strong&gt;responsive&lt;/strong&gt;.&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;Entenderás cuándo usar cada tipo de posicionamiento, por qué &lt;code&gt;z-index&lt;/code&gt; a veces &amp;ldquo;no funciona&amp;rdquo; por culpa de los contextos de apilamiento, y cómo escribir media queries con un enfoque &lt;em&gt;mobile first&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-propiedad-position"&gt;La propiedad position&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;position&lt;/code&gt; acepta cinco valores que cambian cómo se ubica un elemento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static&lt;/code&gt; (por defecto) — el elemento permanece en el flujo normal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relative&lt;/code&gt; — se desplaza respecto a su posición original sin salir del flujo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absolute&lt;/code&gt; — se extrae del flujo y se posiciona respecto a su ancestro posicionado más cercano.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fixed&lt;/code&gt; — se extrae del flujo y se posiciona respecto al viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sticky&lt;/code&gt; — combina &lt;code&gt;relative&lt;/code&gt; y &lt;code&gt;fixed&lt;/code&gt; según el scroll.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las propiedades &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt; y &lt;code&gt;left&lt;/code&gt; controlan la ubicación (y, en algunos casos, el tamaño) de los elementos posicionados.&lt;/p&gt;
&lt;h2 id="fixed-anclado-al-viewport"&gt;Fixed: anclado al viewport&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: fixed&lt;/code&gt; extrae el elemento del flujo normal —los demás se reorganizan como si no existiera— y lo ancla a una posición relativa al viewport, donde permanece aunque el usuario haga scroll. Es la base de los &lt;strong&gt;modales&lt;/strong&gt;: un fondo semitransparente que cubre toda la pantalla y un cuerpo centrado encima.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-backdrop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;bottom&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&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 style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;bottom&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&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;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;white&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;overflow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;auto&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;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;Al posicionar no estás obligado a declarar los cuatro lados. Si omites &lt;code&gt;bottom&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;, la altura la determina el contenido de forma natural. Combinar lados con &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; te da control total sobre el tamaño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="absolute-relativo-al-ancestro-posicionado"&gt;Absolute: relativo al ancestro posicionado&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: absolute&lt;/code&gt; también extrae el elemento del flujo, pero se posiciona respecto al primer ancestro que tenga una posición distinta de &lt;code&gt;static&lt;/code&gt;. Si ningún ancestro está posicionado, usa el &lt;em&gt;bloque contenedor inicial&lt;/em&gt; (el tamaño del viewport).&lt;/p&gt;
&lt;p&gt;Este es el patrón para colocar un botón de cierre en la esquina de un modal: el padre se marca como &lt;code&gt;position: relative&lt;/code&gt; y el botón como &lt;code&gt;position: absolute&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-close&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;absolute&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="position:relative;background:#eaf2f8;padding:1.5em;border-radius:.4em;min-height:4em;"&gt;
 &lt;span style="position:absolute;top:.4em;right:.4em;background:#c0392b;color:#fff;padding:.2em .5em;border-radius:.3em;font-size:.8em;cursor:pointer;"&gt;✕&lt;/span&gt;
 &lt;strong&gt;Cuerpo del modal&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;El botón de cierre está posicionado en la esquina con &lt;code&gt;absolute&lt;/code&gt; respecto a este contenedor &lt;code&gt;relative&lt;/code&gt;.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="relative-desplazamiento-sin-salir-del-flujo"&gt;Relative: desplazamiento sin salir del flujo&lt;/h2&gt;
&lt;p&gt;A diferencia de los anteriores, &lt;code&gt;position: relative&lt;/code&gt; &lt;strong&gt;no&lt;/strong&gt; extrae el elemento del flujo; lo traslada respecto a su posición original, dejando su hueco intacto. Tampoco permite redimensionarlo con la combinación de lados.&lt;/p&gt;
&lt;p&gt;Su uso más frecuente es establecer un &lt;strong&gt;bloque contenedor&lt;/strong&gt; para descendientes absolutos. Es la base de un menú desplegable: el contenedor es &lt;code&gt;relative&lt;/code&gt; y el menú es &lt;code&gt;absolute&lt;/code&gt;, mostrándose con &lt;code&gt;:hover&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inline-block&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:#e5c07b"&gt;dropdown-menu&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;absolute&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&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:#e5c07b"&gt;dropdown&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; .&lt;span style="color:#e5c07b"&gt;dropdown-menu&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;block&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;min-height:9em;"&gt;
 &lt;style&gt;
 .csdrop { position:relative; display:inline-block; }
 .csdrop-label { padding:.5em 1.5em; border:1px solid #ccc; background:#eee; cursor:pointer; border-radius:.3em; }
 .csdrop-menu { position:absolute; top:100%; left:0; min-width:160px; background:#fff; border:1px solid #999; border-radius:.3em; display:none; margin:0; padding:0; list-style:none; box-shadow:0 4px 12px rgba(0,0,0,.15); z-index:1; }
 .csdrop:hover .csdrop-menu { display:block; }
 .csdrop-menu li a { display:block; padding:.5em 1.5em; color:#2a7ae2; text-decoration:none; }
 .csdrop-menu li a:hover { background:#f0f0f0; }
 &lt;/style&gt;
 &lt;div class="csdrop"&gt;
 &lt;div class="csdrop-label"&gt;Menú principal ▾&lt;/div&gt;
 &lt;ul class="csdrop-menu"&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Inicio&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Productos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Contacto&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Pasa el cursor sobre el botón para desplegar el menú.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="sticky-lo-mejor-de-relative-y-fixed"&gt;Sticky: lo mejor de relative y fixed&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: sticky&lt;/code&gt; mantiene el elemento en su posición normal hasta que, al hacer scroll, alcanza el umbral definido por &lt;code&gt;top&lt;/code&gt;/&lt;code&gt;bottom&lt;/code&gt;; en ese momento se &amp;ldquo;pega&amp;rdquo; como si fuera &lt;code&gt;fixed&lt;/code&gt;. Cuando el contenido vuelve, recupera su comportamiento relativo. Es ideal para barras laterales y cabeceras de sección que deben permanecer visibles.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;afijo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;sticky&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="stacking-contexts-y-z-index"&gt;Stacking contexts y z-index&lt;/h2&gt;
&lt;p&gt;Cuando varios elementos posicionados se solapan, &lt;code&gt;z-index&lt;/code&gt; controla el orden de apilamiento en el eje Z. Acepta enteros positivos y negativos: a mayor valor, más al frente.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;uno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;z-index&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 style="color:#e5c07b"&gt;dos&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;z-index&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* queda por encima de .uno */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí está la trampa que confunde a muchos: &lt;strong&gt;cada elemento posicionado con &lt;code&gt;z-index&lt;/code&gt; crea su propio contexto de apilamiento&lt;/strong&gt;. Un hijo dentro de un contexto con &lt;code&gt;z-index: 1&lt;/code&gt; nunca podrá superar a un elemento de un contexto hermano con &lt;code&gt;z-index: 2&lt;/code&gt;, aunque el hijo tenga &lt;code&gt;z-index: 99999&lt;/code&gt;.&lt;/p&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;z-index&lt;/code&gt; tiene dos &amp;ldquo;gotchas&amp;rdquo;: solo funciona sobre elementos posicionados (cualquier &lt;code&gt;position&lt;/code&gt; distinto de &lt;code&gt;static&lt;/code&gt;), y al usarlo creas un nuevo contexto de apilamiento. Si un &lt;code&gt;z-index&lt;/code&gt; enorme &amp;ldquo;no funciona&amp;rdquo;, casi siempre es porque su elemento está atrapado en un contexto de apilamiento de menor prioridad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="responsive-estilos-que-se-adaptan"&gt;Responsive: estilos que se adaptan&lt;/h2&gt;
&lt;p&gt;La enorme variedad de pantallas obliga a diseñar interfaces que respondan a distintos tamaños. La filosofía &lt;strong&gt;mobile first&lt;/strong&gt; consiste en escribir primero los estilos para móvil y luego ampliarlos progresivamente hacia tablets y escritorio.&lt;/p&gt;
&lt;h3 id="media-queries"&gt;Media queries&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;media query&lt;/strong&gt; aplica un bloque de CSS solo cuando se cumple una condición sobre el viewport. Conviene usar &lt;code&gt;em&lt;/code&gt; en los umbrales para que respeten el zoom y la configuración del usuario.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&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:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.25&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&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;Puedes combinar condiciones con lógica:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* AND: ambas condiciones */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;20em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; &lt;span style="color:#e06c75"&gt;and&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;max-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&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:#7f848e"&gt;/* OR: cualquiera de las dos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;max-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;20em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;),&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Entre las características consultables están &lt;code&gt;min-width&lt;/code&gt;, &lt;code&gt;max-width&lt;/code&gt;, &lt;code&gt;min-height&lt;/code&gt;, &lt;code&gt;orientation: landscape | portrait&lt;/code&gt; y &lt;code&gt;min-resolution: 2dppx&lt;/code&gt; (para pantallas retina). El catálogo completo está en la &lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/@media"




 target="_blank"
 


&gt;documentación de &lt;code&gt;@media&lt;/code&gt; en MDN&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="breakpoints-con-mobile-first"&gt;Breakpoints con mobile first&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;breakpoints&lt;/strong&gt; son los puntos donde el diseño cambia de un tamaño a otro. Con el enfoque mobile first, los estilos base sirven al móvil y cada media query añade ajustes para pantallas mayores:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* móvil (base) */&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;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* tablet */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&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;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;50em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* escritorio */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .csresp { font-size:1.5rem;font-weight:bold;color:#16828d;margin:0; }
 @media (min-width:35em) { .csresp { font-size:2rem; } }
 @media (min-width:50em) { .csresp { font-size:2.5rem; } }
 &lt;/style&gt;
 &lt;p class="csresp"&gt;Este título cambia de tamaño según el ancho&lt;/p&gt;
 &lt;small style="color:#555;"&gt;Redimensiona la ventana para cruzar los breakpoints de 35em y 50em.&lt;/small&gt;
&lt;/div&gt;
&lt;h3 id="estilos-para-impresión"&gt;Estilos para impresión&lt;/h3&gt;
&lt;p&gt;Las media queries también cubren el medio de impresión. &lt;code&gt;@media print&lt;/code&gt; aplica reglas cuando el usuario imprime o exporta a PDF:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#e06c75"&gt;print&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;black&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&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;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El posicionamiento te da control fino sobre dónde vive cada elemento: &lt;code&gt;fixed&lt;/code&gt; para modales, &lt;code&gt;absolute&lt;/code&gt; para tooltips y menús, &lt;code&gt;relative&lt;/code&gt; como ancla, y &lt;code&gt;sticky&lt;/code&gt; para elementos que acompañan el scroll. Sumado a un manejo consciente de los contextos de apilamiento y a media queries con enfoque mobile first, tienes las piezas para construir interfaces dinámicas y adaptables.&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;🚀 La próxima entrega explora los &lt;strong&gt;fondos y las sombras&lt;/strong&gt;: gradientes, modos de mezcla y las propiedades &lt;code&gt;box-shadow&lt;/code&gt; y &lt;code&gt;text-shadow&lt;/code&gt; para dar profundidad a tus componentes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Layouts con Float, Flexbox y Grid</title><link>https://blog.dacadev.com/programacion/estilos-css/layouts-flexbox-grid/</link><pubDate>Mon, 08 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/layouts-flexbox-grid/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a maquetar con CSS: el legado de float y clearfix, el modelo flexible de Flexbox y el sistema bidimensional de CSS Grid, con demostraciones renderizadas.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/04-layouts-flexbox-grid-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="#float-el-origen-y-el-clearfix"&gt;Float: el origen y el clearfix&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#flexbox-layout-en-una-dimensión"&gt;Flexbox: layout en una dimensión&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#alinear-ítems-con-justify-content-y-align-items"&gt;Alinear ítems con justify-content y align-items&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#controlar-el-tamaño-flex-grow-flex-shrink-y-flex-basis"&gt;Controlar el tamaño: flex-grow, flex-shrink y flex-basis&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#dirección-y-envoltura"&gt;Dirección y envoltura&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#propiedades-del-ítem"&gt;Propiedades del ítem&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#css-grid-layout-en-dos-dimensiones"&gt;CSS Grid: layout en dos dimensiones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#una-rejilla-básica"&gt;Una rejilla básica&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionar-ítems-por-líneas"&gt;Posicionar ítems por líneas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#áreas-con-nombre"&gt;Áreas con nombre&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rejilla-implícita-y-galerías-responsivas"&gt;Rejilla implícita y galerías responsivas&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#flexbox-y-grid-complementarios-no-rivales"&gt;Flexbox y Grid: complementarios, no rivales&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;Maquetar es componer la estructura visual de una página: columnas, rejillas, barras laterales, galerías. Durante años se hizo con herramientas que no se diseñaron para ello —&lt;code&gt;float&lt;/code&gt; nació para envolver texto alrededor de imágenes— hasta que llegaron &lt;strong&gt;Flexbox&lt;/strong&gt; y &lt;strong&gt;CSS Grid&lt;/strong&gt;, dos sistemas pensados específicamente para layout. Conocer los tres te permite entender el código heredado y elegir la herramienta correcta para cada problema.&lt;/p&gt;
&lt;p&gt;Esta es la cuarta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos &lt;code&gt;float&lt;/code&gt; y la técnica &lt;code&gt;clearfix&lt;/code&gt;, el modelo unidimensional de Flexbox y el sistema bidimensional de Grid, con ejemplos que puedes ver renderizados.&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;Aprenderás cuándo sigue siendo útil &lt;code&gt;float&lt;/code&gt;, cómo controlar el tamaño de los ítems con &lt;code&gt;flex&lt;/code&gt;, y cómo posicionar elementos en una rejilla con &lt;code&gt;grid-template&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="float-el-origen-y-el-clearfix"&gt;Float: el origen y el clearfix&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;float&lt;/code&gt; extrae un elemento del flujo normal y lo desplaza hacia un lado de su contenedor; el contenido adyacente fluye a su alrededor. Ese fue su propósito original: envolver texto alrededor de una imagen.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;imagen&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;float&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;margin-right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="float:left;width:90px;height:90px;background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;margin:0 1em .5em 0;"&gt;float&lt;/div&gt;
 &lt;p style="margin:0;"&gt;Este párrafo fluye alrededor del bloque flotado. El texto se ajusta al margen del elemento extraído del flujo, exactamente el caso de uso para el que &lt;code&gt;float&lt;/code&gt; fue concebido: envolver contenido alrededor de una figura.&lt;/p&gt;
 &lt;div style="clear:both;"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cuando usas &lt;code&gt;float&lt;/code&gt;, necesitas &lt;strong&gt;limpiar&lt;/strong&gt; el flujo para que el contenedor vuelva a comportarse con normalidad. El patrón estándar es el &lt;strong&gt;clearfix&lt;/strong&gt;, implementado con un pseudo-elemento:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&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:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;table&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&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:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;clear&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;both&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;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;Para layouts modernos, &lt;code&gt;float&lt;/code&gt; casi siempre se reemplaza por Flexbox o Grid. Resérvalo para su propósito original: envolver texto alrededor de un elemento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="flexbox-layout-en-una-dimensión"&gt;Flexbox: layout en una dimensión&lt;/h2&gt;
&lt;p&gt;Al aplicar &lt;code&gt;display: flex&lt;/code&gt; a un contenedor, este se convierte en un &lt;strong&gt;flex container&lt;/strong&gt; y sus hijos en &lt;strong&gt;flex items&lt;/strong&gt;. Flexbox organiza los ítems a lo largo de un eje principal y los alinea en el eje transversal, ajustando tamaños de forma flexible.&lt;/p&gt;
&lt;p&gt;Un contenedor flex tiene dos ejes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eje principal (main)&lt;/strong&gt; — la dirección en la que se colocan los ítems (horizontal por defecto).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eje transversal (cross)&lt;/strong&gt; — perpendicular al principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="alinear-ítems-con-justify-content-y-align-items"&gt;Alinear ítems con justify-content y align-items&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; controla la distribución a lo largo del &lt;strong&gt;eje principal&lt;/strong&gt;: &lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;space-between&lt;/code&gt;, &lt;code&gt;space-around&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;align-items&lt;/code&gt; controla la alineación en el &lt;strong&gt;eje transversal&lt;/strong&gt;: &lt;code&gt;stretch&lt;/code&gt; (por defecto), &lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;baseline&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;space-between&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;align-items&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;justify-content:space-between;align-items:center;background:#eaf2f8;padding:.75rem;border-radius:.4em;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Logo&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Menú&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Perfil&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="controlar-el-tamaño-flex-grow-flex-shrink-y-flex-basis"&gt;Controlar el tamaño: flex-grow, flex-shrink y flex-basis&lt;/h3&gt;
&lt;p&gt;La propiedad abreviada &lt;code&gt;flex&lt;/code&gt; agrupa tres propiedades que gobiernan el tamaño de cada ítem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-basis&lt;/code&gt;&lt;/strong&gt; — el tamaño base (de partida) del ítem antes de crecer o encoger. Su valor inicial es &lt;code&gt;auto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-grow&lt;/code&gt;&lt;/strong&gt; — el factor de crecimiento para repartir el espacio sobrante. &lt;code&gt;0&lt;/code&gt; no crece.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-shrink&lt;/code&gt;&lt;/strong&gt; — el factor de encogimiento cuando falta espacio.&lt;/li&gt;
&lt;/ul&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;col-a&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;flex&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* crece para ocupar el espacio sobrante */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;col-b&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;flex&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* crece al doble que col-a */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;gap:.5rem;"&gt;
 &lt;div style="flex:1;background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;text-align:center;"&gt;flex: 1&lt;/div&gt;
 &lt;div style="flex:2;background:#16828d;color:#fff;padding:1em;border-radius:.4em;text-align:center;"&gt;flex: 2 (el doble de ancho)&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="dirección-y-envoltura"&gt;Dirección y envoltura&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex-direction&lt;/code&gt; cambia el eje principal: &lt;code&gt;row&lt;/code&gt; (por defecto), &lt;code&gt;row-reverse&lt;/code&gt;, &lt;code&gt;column&lt;/code&gt;, &lt;code&gt;column-reverse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-wrap&lt;/code&gt; permite que los ítems salten a una nueva línea cuando no caben: &lt;code&gt;nowrap&lt;/code&gt; (por defecto), &lt;code&gt;wrap&lt;/code&gt;, &lt;code&gt;wrap-reverse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-flow&lt;/code&gt; es la abreviatura de ambas: &lt;code&gt;flex-flow: row wrap&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="propiedades-del-ítem"&gt;Propiedades del ítem&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;align-self&lt;/code&gt; — sobrescribe &lt;code&gt;align-items&lt;/code&gt; para un ítem concreto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt; — reordena los ítems sin tocar el HTML; el valor inicial es &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&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;Flexbox crea automáticamente columnas de igual altura y es la herramienta ideal para centrar un elemento. Para un catálogo de bugs conocidos y sus soluciones, consulta &lt;a href="https://github.com/philipwalton/flexbugs"




 target="_blank"
 


&gt;flexbugs&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="css-grid-layout-en-dos-dimensiones"&gt;CSS Grid: layout en dos dimensiones&lt;/h2&gt;
&lt;p&gt;Mientras Flexbox trabaja en un solo eje, &lt;strong&gt;CSS Grid&lt;/strong&gt; organiza el contenido en &lt;strong&gt;filas y columnas&lt;/strong&gt; simultáneamente. Antes de usarlo conviene fijar su vocabulario:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grid line&lt;/strong&gt; — las líneas que forman la estructura de la rejilla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid track&lt;/strong&gt; — el espacio entre dos líneas adyacentes (una fila o una columna).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid cell&lt;/strong&gt; — la intersección de una fila y una columna.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid area&lt;/strong&gt; — un rectángulo formado por una o más celdas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="una-rejilla-básica"&gt;Una rejilla básica&lt;/h3&gt;
&lt;p&gt;Se activa con &lt;code&gt;display: grid&lt;/code&gt; y se definen las pistas con &lt;code&gt;grid-template-columns&lt;/code&gt; y &lt;code&gt;grid-template-rows&lt;/code&gt;. La unidad &lt;code&gt;fr&lt;/code&gt; representa una fracción del espacio disponible.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;grid&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:.5em;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;a&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;b&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;c&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;d&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;e&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;f&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La función &lt;code&gt;repeat()&lt;/code&gt; evita la repetición: &lt;code&gt;grid-template-columns: repeat(3, 1fr)&lt;/code&gt; equivale a &lt;code&gt;1fr 1fr 1fr&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="posicionar-ítems-por-líneas"&gt;Posicionar ítems por líneas&lt;/h3&gt;
&lt;p&gt;Cada línea de la rejilla tiene un número. Con &lt;code&gt;grid-column&lt;/code&gt; y &lt;code&gt;grid-row&lt;/code&gt; indicas dónde empieza y termina un ítem usando la sintaxis &lt;code&gt;inicio / fin&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;destacado&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-column&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* abarca de la línea 1 a la 3 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-row&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;span&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* abarca dos pistas verticales */&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:60px;gap:.5em;"&gt;
 &lt;div style="grid-column:1 / 3;background:#f39c12;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;grid-column: 1 / 3&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;b&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;c&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;d&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;e&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="áreas-con-nombre"&gt;Áreas con nombre&lt;/h3&gt;
&lt;p&gt;La forma más legible de componer un layout es nombrar las áreas con &lt;code&gt;grid-template-areas&lt;/code&gt; y asignar cada elemento con &lt;code&gt;grid-area&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;contenedor&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-areas&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;titulo titulo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;nav nav&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;main aside&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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;header&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;titulo&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;nav&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;nav&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;main&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;main&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;aside&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aside&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-areas:'titulo titulo' 'nav nav' 'main aside';grid-template-columns:2fr 1fr;gap:.5em;"&gt;
 &lt;div style="grid-area:titulo;background:#16828d;color:#fff;padding:.8em;border-radius:.4em;text-align:center;"&gt;titulo&lt;/div&gt;
 &lt;div style="grid-area:nav;background:#1f6f78;color:#fff;padding:.8em;border-radius:.4em;text-align:center;"&gt;nav&lt;/div&gt;
 &lt;div style="grid-area:main;background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;main&lt;/div&gt;
 &lt;div style="grid-area:aside;background:#f39c12;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;aside&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="rejilla-implícita-y-galerías-responsivas"&gt;Rejilla implícita y galerías responsivas&lt;/h3&gt;
&lt;p&gt;Cuando no conoces de antemano la cantidad de ítems —por ejemplo, datos que vienen de una API— la &lt;strong&gt;rejilla implícita&lt;/strong&gt; crece automáticamente para acomodarlos. La combinación de &lt;code&gt;auto-fill&lt;/code&gt; con &lt;code&gt;minmax()&lt;/code&gt; produce galerías que se adaptan al ancho disponible sin media queries:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;galeria&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;repeat&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;fill&lt;/span&gt;, &lt;span style="color:#61afef;font-weight:bold"&gt;minmax&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;180&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.5em;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;1&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;2&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;3&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;4&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;5&lt;/div&gt;
 &lt;/div&gt;
 &lt;small style="display:block;margin-top:.5rem;color:#555;"&gt;Redimensiona la ventana: las columnas se reorganizan solas.&lt;/small&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;Con Grid solo puedes formar rectángulos. No se pueden crear formas en L o U directamente; se simulan dejando celdas vacías (con &lt;code&gt;.&lt;/code&gt; en &lt;code&gt;grid-template-areas&lt;/code&gt;) o combinando áreas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="flexbox-y-grid-complementarios-no-rivales"&gt;Flexbox y Grid: complementarios, no rivales&lt;/h2&gt;
&lt;p&gt;No tienes que elegir uno. La combinación más potente es usar &lt;strong&gt;Grid&lt;/strong&gt; para la estructura macro de la página (cabecera, contenido, barra lateral, pie) y &lt;strong&gt;Flexbox&lt;/strong&gt; para alinear el contenido dentro de cada zona (una barra de navegación, una tarjeta, un grupo de botones).&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;float&lt;/code&gt; resuelve el envolvimiento de texto; Flexbox domina el layout en una dimensión y el centrado; Grid organiza estructuras bidimensionales complejas. Elegir la herramienta adecuada para cada problema —y combinarlas— es lo que distingue una maquetación robusta de una llena de parches.&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;🚀 En la próxima entrega abordamos el &lt;strong&gt;posicionamiento&lt;/strong&gt; (&lt;code&gt;relative&lt;/code&gt;, &lt;code&gt;absolute&lt;/code&gt;, &lt;code&gt;fixed&lt;/code&gt;, &lt;code&gt;sticky&lt;/code&gt;), los contextos de apilamiento con &lt;code&gt;z-index&lt;/code&gt; y el diseño &lt;strong&gt;responsive&lt;/strong&gt; con media queries.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Dominando el modelo de caja</title><link>https://blog.dacadev.com/programacion/estilos-css/modelo-de-caja/</link><pubDate>Sat, 06 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/modelo-de-caja/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina el modelo de caja en CSS: content-box vs border-box, control de overflow, alturas orgánicas, centrado vertical, márgenes negativos y colapso de márgenes.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/03-modelo-de-caja-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="#las-cuatro-regiones-de-una-caja"&gt;Las cuatro regiones de una caja&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#box-sizing-content-box-vs-border-box"&gt;&lt;code&gt;box-sizing&lt;/code&gt;: content-box vs border-box&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#alturas-el-flujo-normal-manda"&gt;Alturas: el flujo normal manda&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#overflow-qué-hacer-cuando-el-contenido-se-desborda"&gt;&lt;code&gt;overflow&lt;/code&gt;: qué hacer cuando el contenido se desborda&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#centrado-vertical"&gt;Centrado vertical&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#márgenes-negativos"&gt;Márgenes negativos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#colapso-de-márgenes-margin-collapsing"&gt;Colapso de márgenes (margin collapsing)&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;El modelo de caja es el sistema con el que CSS calcula el tamaño y el espaciado de cada elemento. Parece trivial, pero es la fuente número uno de layouts impredecibles: un &lt;code&gt;width: 50%&lt;/code&gt; que termina midiendo más de la mitad, dos columnas que no encajan, márgenes que desaparecen sin razón aparente. Todos esos síntomas se explican entendiendo cómo el navegador compone una caja.&lt;/p&gt;
&lt;p&gt;Esta es la tercera entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Analizaremos las cuatro regiones de una caja, el cambio de comportamiento que introduce &lt;code&gt;box-sizing&lt;/code&gt;, el control de &lt;code&gt;overflow&lt;/code&gt;, el manejo de alturas, el centrado vertical y el colapso de márgenes.&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;Comprenderás por qué &lt;code&gt;box-sizing: border-box&lt;/code&gt; debería ser tu valor por defecto y aprenderás a resolver los problemas clásicos de altura, centrado vertical y colapso de márgenes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="las-cuatro-regiones-de-una-caja"&gt;Las cuatro regiones de una caja&lt;/h2&gt;
&lt;p&gt;Todo elemento HTML se compone, de adentro hacia afuera, de cuatro capas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;content&lt;/strong&gt; — el área donde vive el contenido (texto, imágenes).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;padding&lt;/strong&gt; — el espacio interno entre el contenido y el borde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;border&lt;/strong&gt; — el borde que rodea el padding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;margin&lt;/strong&gt; — el espacio externo que separa la caja de sus vecinos.&lt;/li&gt;
&lt;/ul&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;div&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;caja&amp;#34;&lt;/span&gt;&amp;gt;content + padding + border + margin&amp;lt;/&lt;span style="color:#e06c75"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px dashed #f39c12;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;div style="background:#fdebd0;padding:1.25rem;border:3px solid #2a9da9;font-family:Helvetica,Arial,sans-serif;color:#111;"&gt;
 &lt;div style="background:#aed6f1;padding:.75rem;"&gt;content&lt;/div&gt;
 &lt;small style="display:block;margin-top:.4rem;color:#555;"&gt;El área azul es el &lt;code&gt;content&lt;/code&gt;; el beige es el &lt;code&gt;padding&lt;/code&gt;; el trazo turquesa es el &lt;code&gt;border&lt;/code&gt;; el espacio punteado exterior es el &lt;code&gt;margin&lt;/code&gt;.&lt;/small&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="box-sizing-content-box-vs-border-box"&gt;&lt;code&gt;box-sizing&lt;/code&gt;: content-box vs border-box&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;box-sizing&lt;/code&gt; decide qué incluye el &lt;code&gt;width&lt;/code&gt; y el &lt;code&gt;height&lt;/code&gt; que declaras.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;content-box&lt;/code&gt;&lt;/strong&gt; (valor por defecto) — &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; miden &lt;strong&gt;solo&lt;/strong&gt; el contenido. El &lt;code&gt;padding&lt;/code&gt; y el &lt;code&gt;border&lt;/code&gt; se suman &lt;em&gt;por fuera&lt;/em&gt;, agrandando el tamaño final.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;border-box&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; miden el conjunto de contenido + padding + border. El tamaño que declaras es el tamaño real renderizado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mira dos cajas con &lt;code&gt;width: 200px&lt;/code&gt; y &lt;code&gt;padding: 20px&lt;/code&gt;, una con cada modelo:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;content-box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;content-box&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* ancho real: 200 + 40 = 240px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* ancho real: 200px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="box-sizing:content-box;width:200px;padding:20px;border:3px solid #c0392b;background:#fdecea;margin-bottom:.75rem;color:#111;"&gt;content-box → mide 246px en total&lt;/div&gt;
 &lt;div style="box-sizing:border-box;width:200px;padding:20px;border:3px solid #27ae60;background:#eafaf1;color:#111;"&gt;border-box → mide 200px en total&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Por eso es práctica recomendada activar &lt;code&gt;border-box&lt;/code&gt; de forma global, heredándolo para no romper estilos de terceros:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&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:#56b6c2"&gt;*,&lt;/span&gt; ::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; ::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inherit&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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 los &lt;strong&gt;números mágicos&lt;/strong&gt;: valores arbitrarios (&lt;code&gt;margin-top: 37px&lt;/code&gt;) que &amp;ldquo;cuadran&amp;rdquo; un diseño por casualidad. Haz que el contenido se adapte al contenedor, no al revés.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="alturas-el-flujo-normal-manda"&gt;Alturas: el flujo normal manda&lt;/h2&gt;
&lt;p&gt;La altura de un contenedor es &lt;strong&gt;orgánica&lt;/strong&gt; por defecto: la define su contenido, no el contenedor. Esto tiene dos consecuencias prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Definir &lt;code&gt;height&lt;/code&gt; en porcentaje rara vez funciona, porque se refiere a la altura del padre, que a su vez depende de su contenido.&lt;/li&gt;
&lt;li&gt;Para que un &lt;code&gt;height: 100%&lt;/code&gt; funcione, el padre necesita una altura explícita en unidades absolutas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En lugar de fijar alturas, prefiere restringir el rango con &lt;code&gt;min-height&lt;/code&gt; y &lt;code&gt;max-height&lt;/code&gt;, dejando que el contenido fluya:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;min-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;max-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overflow-qué-hacer-cuando-el-contenido-se-desborda"&gt;&lt;code&gt;overflow&lt;/code&gt;: qué hacer cuando el contenido se desborda&lt;/h2&gt;
&lt;p&gt;Cuando el contenido excede el tamaño de su caja, &lt;code&gt;overflow&lt;/code&gt; define el comportamiento:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Valor&lt;/th&gt;
 &lt;th&gt;Comportamiento&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;visible&lt;/code&gt; (por defecto)&lt;/td&gt;
 &lt;td&gt;El contenido se desborda y permanece visible.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hidden&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El contenido que se sale se recorta.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scroll&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Siempre añade barras de desplazamiento.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Añade barras solo si hace falta.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;recorte&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;overflow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;max-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="overflow:auto;max-height:5em;border:1px solid #ccc;padding:.5rem;color:#111;"&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Este contenedor tiene &lt;code&gt;overflow: auto&lt;/code&gt; y una altura máxima.&lt;/p&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Cuando el contenido supera esa altura, aparece una barra de desplazamiento.&lt;/p&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Línea adicional para forzar el desbordamiento.&lt;/p&gt;
 &lt;p style="margin:0;"&gt;Y una más para asegurar el scroll.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Puedes controlar cada eje por separado con &lt;code&gt;overflow-x&lt;/code&gt; y &lt;code&gt;overflow-y&lt;/code&gt;, aunque mezclar valores distintos suele dar resultados poco predecibles.&lt;/p&gt;
&lt;h2 id="centrado-vertical"&gt;Centrado vertical&lt;/h2&gt;
&lt;p&gt;Centrar verticalmente fue durante años un dolor de cabeza en CSS. La propiedad &lt;code&gt;vertical-align&lt;/code&gt; no sirve para esto: solo aplica a elementos &lt;code&gt;inline&lt;/code&gt; y a celdas de tabla. Hoy tenemos varias soluciones según el escenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;¿Puedes usar la altura natural?&lt;/strong&gt; Aplica un &lt;code&gt;padding&lt;/code&gt; igual arriba y abajo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Necesitas altura fija?&lt;/strong&gt; Usa &lt;code&gt;display: table-cell&lt;/code&gt; con &lt;code&gt;vertical-align: middle&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El caso general:&lt;/strong&gt; usa &lt;strong&gt;flexbox&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Una sola línea de texto?&lt;/strong&gt; Usa &lt;code&gt;line-height&lt;/code&gt; igual a la altura del contenedor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La solución moderna por excelencia es flexbox, que centra en ambos ejes con tres declaraciones:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;centro&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;align-items&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* eje vertical */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* eje horizontal */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;min-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;div style="display:flex;align-items:center;justify-content:center;min-height:8em;background:#eaf2f8;border-radius:.4em;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.6em 1.2em;border-radius:.4em;"&gt;Centrado en ambos ejes&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="márgenes-negativos"&gt;Márgenes negativos&lt;/h2&gt;
&lt;p&gt;A diferencia de &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;border&lt;/code&gt;, los márgenes admiten valores &lt;strong&gt;negativos&lt;/strong&gt;, lo que te permite tirar de un elemento hacia afuera de su posición natural o solaparlo con su vecino.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;solapado&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;margin-top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;-1.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;"&gt;Bloque base&lt;/div&gt;
 &lt;div style="background:#f39c12;color:#fff;padding:1em;border-radius:.4em;margin-top:-1.5em;margin-left:2em;"&gt;Bloque con &lt;code&gt;margin-top&lt;/code&gt; negativo que se solapa&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="colapso-de-márgenes-margin-collapsing"&gt;Colapso de márgenes (margin collapsing)&lt;/h2&gt;
&lt;p&gt;Cuando dos márgenes verticales se encuentran, &lt;strong&gt;no se suman&lt;/strong&gt;: se &lt;em&gt;colapsan&lt;/em&gt;, quedando solo el de mayor valor. Si un párrafo tiene &lt;code&gt;margin-bottom: 30px&lt;/code&gt; y el siguiente &lt;code&gt;margin-top: 20px&lt;/code&gt;, la separación entre ambos será de &lt;code&gt;30px&lt;/code&gt;, no &lt;code&gt;50px&lt;/code&gt;.&lt;/p&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;El colapso de márgenes solo ocurre con márgenes &lt;strong&gt;verticales&lt;/strong&gt; (arriba y abajo). Los márgenes horizontales (izquierda y derecha) nunca colapsan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hay varias formas de impedir el colapso cuando no lo deseas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Aplicar &lt;code&gt;overflow: auto&lt;/code&gt; (o cualquier valor distinto de &lt;code&gt;visible&lt;/code&gt;) al contenedor.&lt;/li&gt;
&lt;li&gt;Añadir un &lt;code&gt;border&lt;/code&gt; o un &lt;code&gt;padding&lt;/code&gt; entre los dos márgenes.&lt;/li&gt;
&lt;li&gt;Usar un contenedor flotado, &lt;code&gt;inline-block&lt;/code&gt; o con posición absoluta/fija.&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;flexbox&lt;/strong&gt; o &lt;strong&gt;grid&lt;/strong&gt;: los márgenes entre ítems del layout no colapsan.&lt;/li&gt;
&lt;li&gt;Los elementos con &lt;code&gt;display: table-cell&lt;/code&gt; no tienen margen, así que no colapsan.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El modelo de caja deja de ser un misterio cuando interiorizas que &lt;code&gt;box-sizing&lt;/code&gt; controla la aritmética del tamaño, que la altura es orgánica por naturaleza y que los márgenes verticales colapsan. Activar &lt;code&gt;border-box&lt;/code&gt; de forma global y apoyarte en flexbox para el centrado elimina la mayoría de los problemas clásicos de maquetación.&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;🚀 La siguiente entrega cubre los sistemas de &lt;strong&gt;layout&lt;/strong&gt;: &lt;code&gt;float&lt;/code&gt;, &lt;strong&gt;flexbox&lt;/strong&gt; y &lt;strong&gt;CSS Grid&lt;/strong&gt;, las herramientas con las que componemos la estructura completa de una página.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Selectores, combinadores y pseudo-clases</title><link>https://blog.dacadev.com/programacion/estilos-css/selectores-css/</link><pubDate>Thu, 04 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/selectores-css/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a apuntar a cualquier elemento con los selectores de CSS: básicos, combinadores, pseudo-clases, pseudo-elementos y selectores de atributo, con ejemplos en vivo.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/02-selectores-css-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="#selectores-básicos"&gt;Selectores básicos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinadores"&gt;Combinadores&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#selectores-compuestos"&gt;Selectores compuestos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pseudo-clases"&gt;Pseudo-clases&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#posición-estructural"&gt;Posición estructural&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estado-e-interacción"&gt;Estado e interacción&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#campos-de-formulario"&gt;Campos de formulario&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#pseudo-elementos"&gt;Pseudo-elementos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#selectores-de-atributo"&gt;Selectores de atributo&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;Un selector es el mecanismo con el que CSS apunta a los elementos que vas a estilizar. Elegir el selector correcto no es solo cuestión de que &amp;ldquo;funcione&amp;rdquo;: impacta directamente en la especificidad, en el acoplamiento de tus estilos y en la facilidad para mantenerlos. CSS ofrece un catálogo amplio de selectores, y conocerlos a fondo te evita escribir reglas frágiles.&lt;/p&gt;
&lt;p&gt;Este artículo es la segunda entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos los selectores básicos, los combinadores, las pseudo-clases, los pseudo-elementos y los selectores de atributo, con ejemplos que puedes ver renderizados aquí mismo.&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;Repasaremos cada familia de selectores con su especificidad y demostraciones en vivo, para que puedas elegir siempre la opción más precisa y de menor acoplamiento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="selectores-básicos"&gt;Selectores básicos&lt;/h2&gt;
&lt;p&gt;Son los cuatro selectores fundamentales sobre los que se construye todo lo demás:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selector de tipo&lt;/strong&gt; (&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1&lt;/code&gt;) — apunta por nombre de etiqueta. Especificidad &lt;code&gt;0,0,1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector de clase&lt;/strong&gt; (&lt;code&gt;.media&lt;/code&gt;) — apunta a los elementos con esa clase. Especificidad &lt;code&gt;0,1,0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector de ID&lt;/strong&gt; (&lt;code&gt;#sidebar&lt;/code&gt;) — apunta al elemento con ese &lt;code&gt;id&lt;/code&gt;. Especificidad &lt;code&gt;1,0,0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector universal&lt;/strong&gt; (&lt;code&gt;*&lt;/code&gt;) — apunta a todos los elementos. Especificidad &lt;code&gt;0,0,0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="combinadores"&gt;Combinadores&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;combinadores&lt;/strong&gt; unen selectores simples para describir una relación entre elementos.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Combinador&lt;/th&gt;
 &lt;th&gt;Símbolo&lt;/th&gt;
 &lt;th&gt;Significado&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Descendiente&lt;/td&gt;
 &lt;td&gt;(espacio)&lt;/td&gt;
 &lt;td&gt;Cualquier descendiente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.menu li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hijo directo&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hijo inmediato&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.lista &amp;gt; li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermano adyacente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El elemento inmediatamente siguiente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p + h2&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermano general&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Todos los hermanos posteriores&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;li.activo ~ li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El combinador de hijo directo (&lt;code&gt;&amp;gt;&lt;/code&gt;) solo afecta al primer nivel de descendientes. Observa la diferencia con el descendiente:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;lista&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;li&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bold&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* solo hijos directos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;lista&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Hijo directo (en negrita)&amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Hijo directo (en negrita)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Nieto (sin negrita)&amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-child &gt; li { font-weight:bold; }
 .cssel-child ul li { font-weight:normal; }
 .cssel-child, .cssel-child ul { font-family:Helvetica,Arial,sans-serif; }
 &lt;/style&gt;
 &lt;ul class="cssel-child"&gt;
 &lt;li&gt;Hijo directo (en negrita)&lt;/li&gt;
 &lt;li&gt;Hijo directo (en negrita)
 &lt;ul&gt;
 &lt;li&gt;Nieto (sin negrita)&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="selectores-compuestos"&gt;Selectores compuestos&lt;/h2&gt;
&lt;p&gt;Varios selectores simples se pueden unir &lt;strong&gt;sin espacios&lt;/strong&gt; para formar un selector compuesto que exige que el elemento cumpla &lt;em&gt;todas&lt;/em&gt; las condiciones. Por ejemplo, &lt;code&gt;.dropdown.is-active&lt;/code&gt; apunta a &lt;code&gt;&amp;lt;div class=&amp;quot;dropdown is-active&amp;quot;&amp;gt;&lt;/code&gt; pero no a &lt;code&gt;&amp;lt;div class=&amp;quot;dropdown&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="pseudo-clases"&gt;Pseudo-clases&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;pseudo-clases&lt;/strong&gt; apuntan a elementos según un estado: interacción del usuario o posición respecto a sus hermanos. Empiezan con un solo dos puntos (&lt;code&gt;:&lt;/code&gt;) y tienen la especificidad de una clase (&lt;code&gt;0,1,0&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="posición-estructural"&gt;Posición estructural&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:first-child&lt;/code&gt;, &lt;code&gt;:last-child&lt;/code&gt;, &lt;code&gt;:only-child&lt;/code&gt; — primero, último o único hijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-child(an + b)&lt;/code&gt; — apunta según una fórmula posicional entre sus hermanos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-last-child()&lt;/code&gt; — igual, pero contando desde el final.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:first-of-type&lt;/code&gt;, &lt;code&gt;:last-of-type&lt;/code&gt;, &lt;code&gt;:nth-of-type()&lt;/code&gt; — equivalentes, pero solo cuentan elementos del mismo tipo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:not(&amp;lt;selector&amp;gt;)&lt;/code&gt; — apunta a lo que &lt;em&gt;no&lt;/em&gt; coincide con el selector interno.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:empty&lt;/code&gt; — elementos sin hijos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un patrón clásico: aplicar un fondo alterno con &lt;code&gt;:nth-child(even)&lt;/code&gt; para crear filas tipo &amp;ldquo;cebra&amp;rdquo;.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;zebra&lt;/span&gt; &lt;span style="color:#e06c75"&gt;li&lt;/span&gt;:&lt;span style="color:#61afef"&gt;nth-child&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;even&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-zebra { list-style:none;padding:0;margin:0;font-family:Helvetica,Arial,sans-serif; }
 .cssel-zebra li { padding:.5em .75em; }
 .cssel-zebra li:nth-child(even) { background:#ecf0f1; }
 &lt;/style&gt;
 &lt;ul class="cssel-zebra"&gt;
 &lt;li&gt;Fila 1&lt;/li&gt;
 &lt;li&gt;Fila 2 (resaltada)&lt;/li&gt;
 &lt;li&gt;Fila 3&lt;/li&gt;
 &lt;li&gt;Fila 4 (resaltada)&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="estado-e-interacción"&gt;Estado e interacción&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:hover&lt;/code&gt; — mientras el cursor está sobre el elemento.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:focus&lt;/code&gt; — cuando el elemento recibe foco (clic, toque o tabulación).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:root&lt;/code&gt; — el elemento raíz del documento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="campos-de-formulario"&gt;Campos de formulario&lt;/h3&gt;
&lt;p&gt;Varias pseudo-clases describen el estado de los controles: &lt;code&gt;:disabled&lt;/code&gt;, &lt;code&gt;:enabled&lt;/code&gt;, &lt;code&gt;:checked&lt;/code&gt;, &lt;code&gt;:invalid&lt;/code&gt;, &lt;code&gt;:valid&lt;/code&gt;, &lt;code&gt;:required&lt;/code&gt;, &lt;code&gt;:optional&lt;/code&gt;. Aquí, &lt;code&gt;:invalid&lt;/code&gt; cambia el borde cuando el valor no es un correo válido:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;input&lt;/span&gt;:&lt;span style="color:#61afef"&gt;invalid&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;input&lt;/span&gt;:&lt;span style="color:#61afef"&gt;valid&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#27ae60&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-form input { padding:.5em;border:2px solid #ccc;border-radius:.3em;font-size:1rem;font-family:Helvetica,Arial,sans-serif; }
 .cssel-form input:invalid { border-color:#c0392b; }
 .cssel-form input:valid { border-color:#27ae60; }
 &lt;/style&gt;
 &lt;div class="cssel-form"&gt;
 &lt;label&gt;Escribe un correo: &lt;input type="email" placeholder="tu@correo.com" required&gt;&lt;/label&gt;
 &lt;/div&gt;
&lt;/div&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;La lista de pseudo-clases es extensa y evoluciona con cada nivel de la especificación. Consulta la &lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/Pseudo-classes"




 target="_blank"
 


&gt;documentación de MDN sobre pseudo-clases&lt;/a&gt; para el catálogo completo y el soporte por navegador.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="pseudo-elementos"&gt;Pseudo-elementos&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;pseudo-elementos&lt;/strong&gt; no apuntan a un elemento existente, sino a una parte del documento que no tiene marcado propio, o inyectan contenido nuevo. Usan doble dos puntos (&lt;code&gt;::&lt;/code&gt;) y tienen la especificidad de un selector de tipo (&lt;code&gt;0,0,1&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;::before&lt;/code&gt; — inserta un primer hijo virtual. Requiere la propiedad &lt;code&gt;content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::after&lt;/code&gt; — inserta un último hijo virtual. Requiere &lt;code&gt;content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::first-letter&lt;/code&gt; — estiliza la primera letra del texto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::first-line&lt;/code&gt; — estiliza la primera línea.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::selection&lt;/code&gt; — estiliza el texto que el usuario resalta.&lt;/li&gt;
&lt;/ul&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;nota&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;★ &amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#f39c12&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;capitular&lt;/span&gt;::&lt;span style="color:#61afef"&gt;first-letter&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bold&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;p style="margin:.2rem 0;"&gt;&lt;span style="color:#f39c12;"&gt;★ &lt;/span&gt;Texto precedido por un pseudo-elemento &lt;code&gt;::before&lt;/code&gt;.&lt;/p&gt;
 &lt;p style="margin:.6rem 0 0;"&gt;&lt;span style="font-size:2.5em;font-weight:bold;color:#2a9da9;"&gt;L&lt;/span&gt;orem ipsum con la primera letra estilizada como capitular.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="selectores-de-atributo"&gt;Selectores de atributo&lt;/h2&gt;
&lt;p&gt;Apuntan a elementos según sus atributos HTML. Tienen la especificidad de una clase (&lt;code&gt;0,1,0&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Selector&lt;/th&gt;
 &lt;th&gt;Coincide cuando el atributo&amp;hellip;&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;existe&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input[disabled]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es exactamente igual&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input[type=&amp;quot;radio&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr^=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empieza con el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[href^=&amp;quot;https&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr$=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;termina con el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[href$=&amp;quot;.pdf&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr*=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;contiene el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[class*=&amp;quot;sprite-&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr~=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es una lista separada por espacios que incluye el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[rel~=&amp;quot;author&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr|=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es igual o empieza con &lt;code&gt;valor-&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[lang|=&amp;quot;es&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Por ejemplo, podemos marcar visualmente los enlaces externos y los que apuntan a un PDF:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;[&lt;/span&gt;&lt;span style="color:#e06c75"&gt;href&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;^=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;https&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;]&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; ↗&amp;#34;&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;[&lt;/span&gt;&lt;span style="color:#e06c75"&gt;href&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;$=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;.pdf&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;]&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; (PDF)&amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;p style="margin:0;"&gt;
 &lt;a href="https://developer.mozilla.org" style="color:#2a7ae2;"&gt;Enlace externo&lt;span style="color:#2a7ae2;"&gt; ↗&lt;/span&gt;&lt;/a&gt; ·
 &lt;a href="#" style="color:#2a7ae2;"&gt;Documento&lt;span style="color:#c0392b;"&gt; (PDF)&lt;/span&gt;&lt;/a&gt;
 &lt;/p&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;Los selectores de atributo distinguen mayúsculas y minúsculas por defecto. La especificación nivel 4 añade un modificador &lt;code&gt;i&lt;/code&gt; antes del corchete de cierre —&lt;code&gt;input[value=&amp;quot;search&amp;quot; i]&lt;/code&gt;— para hacerlos insensibles a mayúsculas. Verifica el soporte antes de usarlo en producción.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El catálogo de selectores de CSS es amplio y cada familia resuelve un problema distinto. La clave está en elegir el selector más preciso con la menor especificidad posible: eso mantiene tus estilos desacoplados y fáciles de sobrescribir cuando lo necesites.&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;🚀 En la siguiente entrega abordamos el &lt;strong&gt;modelo de caja&lt;/strong&gt;: cómo &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;content&lt;/code&gt; definen el tamaño real de cada elemento y cómo &lt;code&gt;box-sizing&lt;/code&gt; cambia las reglas del juego.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Cascada, especificidad, herencia y unidades</title><link>https://blog.dacadev.com/programacion/estilos-css/fundamentos-cascada-especificidad-herencia/</link><pubDate>Tue, 02 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/fundamentos-cascada-especificidad-herencia/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina los fundamentos de CSS: cómo resuelve el navegador los conflictos de estilos con la cascada, la especificidad, la herencia y las unidades em, rem y vw.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/01-fundamentos-cascada-especificidad-herencia-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="#la-cascada-cómo-el-navegador-resuelve-conflictos"&gt;La cascada: cómo el navegador resuelve conflictos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#origen-de-los-estilos"&gt;Origen de los estilos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#especificidad-el-peso-de-un-selector"&gt;Especificidad: el peso de un selector&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#orden-del-código-el-último-en-hablar-gana"&gt;Orden del código: el último en hablar gana&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#herencia-propiedades-que-viajan-hacia-abajo"&gt;Herencia: propiedades que viajan hacia abajo&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#valores-especiales-inherit-e-initial"&gt;Valores especiales: &lt;code&gt;inherit&lt;/code&gt; e &lt;code&gt;initial&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#unidades-absolutas-vs-relativas"&gt;Unidades absolutas vs. relativas&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#em-relativo-al-elemento"&gt;&lt;code&gt;em&lt;/code&gt;: relativo al elemento&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rem-relativo-a-la-raíz"&gt;&lt;code&gt;rem&lt;/code&gt;: relativo a la raíz&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#unidades-relativas-al-viewport"&gt;Unidades relativas al viewport&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#calc-para-combinar-unidades"&gt;&lt;code&gt;calc()&lt;/code&gt; para combinar unidades&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#números-sin-unidad-y-line-height"&gt;Números sin unidad y &lt;code&gt;line-height&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#custom-properties-variables-css"&gt;Custom properties (variables CSS)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#redefinir-variables-por-contexto"&gt;Redefinir variables por contexto&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&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;Cuando dos reglas de estilo compiten por el mismo elemento, el resultado no es aleatorio: el navegador aplica un algoritmo determinista para decidir cuál gana. Comprender ese algoritmo —la cascada, la especificidad y la herencia— es la diferencia entre pelear contra CSS a punta de &lt;code&gt;!important&lt;/code&gt; y escribir hojas de estilo predecibles y mantenibles.&lt;/p&gt;
&lt;p&gt;Este artículo abre la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Analizaremos cómo el navegador resuelve conflictos, cómo se calcula el peso de un selector y cómo aprovechar las unidades relativas para construir interfaces que escalan.&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;Al terminar entenderás el modelo mental que rige &lt;em&gt;toda&lt;/em&gt; hoja de estilos: origen de los estilos, especificidad, orden del código, herencia y el sistema de unidades relativas (&lt;code&gt;em&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;vw&lt;/code&gt;) junto con las variables CSS.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-cascada-cómo-el-navegador-resuelve-conflictos"&gt;La cascada: cómo el navegador resuelve conflictos&lt;/h2&gt;
&lt;p&gt;CSS significa &lt;em&gt;Cascading Style Sheets&lt;/em&gt;. La &lt;strong&gt;cascada&lt;/strong&gt; es precisamente el conjunto de reglas que determina qué declaración prevalece cuando varias apuntan a la misma propiedad de un elemento. El navegador evalúa tres criterios en orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Origen de la hoja de estilos&lt;/strong&gt; — de dónde provienen los estilos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Especificidad del selector&lt;/strong&gt; — qué selector es más &amp;ldquo;específico&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orden en el código&lt;/strong&gt; — cuál se declaró de último.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="origen-de-los-estilos"&gt;Origen de los estilos&lt;/h3&gt;
&lt;p&gt;Existen tres orígenes posibles, con prioridad creciente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User agent styles&lt;/strong&gt; — los estilos por defecto del navegador (por ejemplo, el &lt;code&gt;margin&lt;/code&gt; de un &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; o el subrayado de un enlace).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author styles&lt;/strong&gt; — los estilos que tú defines en tus archivos &lt;code&gt;.css&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User styles&lt;/strong&gt; — estilos configurados por el propio usuario en el navegador (accesibilidad, tamaños de fuente). Tienen prioridad sobre los anteriores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tus estilos (&lt;em&gt;author&lt;/em&gt;) pisan a los del navegador, que es justo lo que esperas al escribir una hoja de estilos.&lt;/p&gt;
&lt;h2 id="especificidad-el-peso-de-un-selector"&gt;Especificidad: el peso de un selector&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;especificidad&lt;/strong&gt; se representa con la notación &lt;code&gt;0,0,0,0&lt;/code&gt;, donde cada posición cuenta, de izquierda a derecha: estilos &lt;em&gt;inline&lt;/em&gt;, IDs, clases y nombres de etiqueta.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Componente&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;th&gt;Peso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de etiqueta&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,0,0,1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de clase&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.nav-menu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,0,1,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de ID&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#sidebar&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,1,0,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Estilo inline&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;style=&amp;quot;...&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1,0,0,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Las reglas de desempate son sencillas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Una declaración con &lt;code&gt;!important&lt;/code&gt; gana por encima de todo (úsala con prudencia).&lt;/li&gt;
&lt;li&gt;Gana el selector con más IDs.&lt;/li&gt;
&lt;li&gt;Si hay empate, gana el que tenga más clases.&lt;/li&gt;
&lt;li&gt;Si persiste el empate, gana el que tenga más etiquetas.&lt;/li&gt;
&lt;/ol&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;Las pseudo-clases (&lt;code&gt;:hover&lt;/code&gt;) y los selectores de atributo (&lt;code&gt;[type=&amp;quot;text&amp;quot;]&lt;/code&gt;) cuentan como una clase (&lt;code&gt;0,0,1,0&lt;/code&gt;). El selector universal &lt;code&gt;*&lt;/code&gt; y los combinadores (&lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;) &lt;strong&gt;no&lt;/strong&gt; aportan especificidad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Observa cómo dos reglas compiten por el color del párrafo. La clase &lt;code&gt;.destacado&lt;/code&gt; gana al selector de etiqueta &lt;code&gt;p&lt;/code&gt;, aunque la regla de &lt;code&gt;p&lt;/code&gt; se declare después:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#555&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;destacado&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;Texto con el color por defecto del selector de etiqueta.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;destacado&amp;#34;&lt;/span&gt;&amp;gt;Este párrafo gana por especificidad de clase.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .csfund-spec p { color:#555;margin:.25rem 0;font-family:Helvetica,Arial,sans-serif; }
 .csfund-spec .destacado { color:#c0392b;font-weight:bold; }
 &lt;/style&gt;
 &lt;div class="csfund-spec"&gt;
 &lt;p&gt;Texto con el color por defecto del selector de etiqueta.&lt;/p&gt;
 &lt;p class="destacado"&gt;Este párrafo gana por especificidad de clase.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="orden-del-código-el-último-en-hablar-gana"&gt;Orden del código: el último en hablar gana&lt;/h2&gt;
&lt;p&gt;Cuando dos declaraciones tienen el &lt;strong&gt;mismo origen y la misma especificidad&lt;/strong&gt;, el navegador aplica la que aparece de última en el código fuente. Este comportamiento es crítico al ordenar las pseudo-clases de un enlace.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;link&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a7ae2&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;visited&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#8e44ad&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-decoration&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;underline&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;active&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como las cuatro pseudo-clases tienen la misma especificidad, su orden importa. La regla mnemotécnica es &lt;strong&gt;LoVe/HAte&lt;/strong&gt; — &lt;em&gt;link, visited, hover, active&lt;/em&gt;. Si inviertes &lt;code&gt;:hover&lt;/code&gt; y &lt;code&gt;:link&lt;/code&gt;, el &lt;code&gt;:hover&lt;/code&gt; nunca se aplicaría.&lt;/p&gt;
&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .csfund-links a { font-family:Helvetica,Arial,sans-serif;font-weight:bold;text-decoration:none;color:#2a7ae2; }
 .csfund-links a:hover { text-decoration:underline;color:#c0392b; }
 &lt;/style&gt;
 &lt;p class="csfund-links" style="margin:0;"&gt;&lt;a href="#fundamentos-cascada-especificidad-herencia"&gt;Pasa el cursor sobre este enlace&lt;/a&gt; para ver el efecto del orden del código.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="herencia-propiedades-que-viajan-hacia-abajo"&gt;Herencia: propiedades que viajan hacia abajo&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;herencia&lt;/strong&gt; permite que ciertas propiedades de un elemento padre se transmitan a sus hijos. No todas las propiedades heredan: lo hacen principalmente las relacionadas con texto (&lt;code&gt;color&lt;/code&gt;, &lt;code&gt;font-family&lt;/code&gt;, &lt;code&gt;line-height&lt;/code&gt;, &lt;code&gt;text-align&lt;/code&gt;), mientras que las de caja (&lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;) no.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#1a5276&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Georgia&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;serif&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;div&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;tarjeta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;h4&lt;/span&gt;&amp;gt;Título heredado&amp;lt;/&lt;span style="color:#e06c75"&gt;h4&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;Este párrafo hereda &amp;lt;&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt;color&amp;lt;/&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt; y &amp;lt;&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt;font-family&amp;lt;/&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt; del contenedor.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#e06c75"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="color:#1a5276;font-family:Georgia,serif;"&gt;
 &lt;h4 style="margin:.2rem 0;"&gt;Título heredado&lt;/h4&gt;
 &lt;p style="margin:.2rem 0;"&gt;Este párrafo hereda &lt;em&gt;color&lt;/em&gt; y &lt;em&gt;font-family&lt;/em&gt; del contenedor.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="valores-especiales-inherit-e-initial"&gt;Valores especiales: &lt;code&gt;inherit&lt;/code&gt; e &lt;code&gt;initial&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Dos palabras clave te dan control explícito sobre la herencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;inherit&lt;/code&gt; — fuerza a una propiedad a tomar el valor del padre, incluso en propiedades que normalmente no heredan.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;initial&lt;/code&gt; — restablece la propiedad a su valor inicial según la especificación, ignorando la herencia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="unidades-absolutas-vs-relativas"&gt;Unidades absolutas vs. relativas&lt;/h2&gt;
&lt;p&gt;El píxel (&lt;code&gt;px&lt;/code&gt;) es la unidad &lt;strong&gt;absoluta&lt;/strong&gt; más común. Existen otras (&lt;code&gt;pt&lt;/code&gt;, &lt;code&gt;cm&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt;) con equivalencias fijas: &lt;code&gt;1in = 96px = 72pt&lt;/code&gt;. Sin embargo, las unidades &lt;strong&gt;relativas&lt;/strong&gt; son las que permiten construir interfaces que escalan con el contexto.&lt;/p&gt;
&lt;h3 id="em-relativo-al-elemento"&gt;&lt;code&gt;em&lt;/code&gt;: relativo al elemento&lt;/h3&gt;
&lt;p&gt;Un &lt;code&gt;em&lt;/code&gt; equivale al &lt;code&gt;font-size&lt;/code&gt; del propio elemento. Es ideal para &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;border-radius&lt;/code&gt;, porque estos escalan junto con el tamaño de fuente.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja--pequena&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja--grande&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;display:flex;gap:1rem;align-items:flex-start;flex-wrap:wrap;"&gt;
 &lt;span style="font-size:12px;padding:1em;border-radius:1em;background:#ecf0f1;color:#111;"&gt;padding 1em · 12px&lt;/span&gt;
 &lt;span style="font-size:20px;padding:1em;border-radius:1em;background:#ecf0f1;color:#111;"&gt;padding 1em · 20px&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;El &lt;code&gt;padding&lt;/code&gt; de ambas cajas es &lt;code&gt;1em&lt;/code&gt;, pero al cambiar el &lt;code&gt;font-size&lt;/code&gt; el espaciado escala proporcionalmente sin tocar la propiedad &lt;code&gt;padding&lt;/code&gt;.&lt;/p&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;Para convertir un tamaño en píxeles a &lt;code&gt;em&lt;/code&gt;, divide el tamaño deseado entre el tamaño heredado: si quieres &lt;code&gt;16px&lt;/code&gt; y el padre tiene &lt;code&gt;12px&lt;/code&gt;, entonces &lt;code&gt;16 / 12 = 1.333em&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="rem-relativo-a-la-raíz"&gt;&lt;code&gt;rem&lt;/code&gt;: relativo a la raíz&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; (&lt;em&gt;root em&lt;/em&gt;) siempre toma como referencia el &lt;code&gt;font-size&lt;/code&gt; del elemento raíz (&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; o &lt;code&gt;:root&lt;/code&gt;). Esto te da un punto de control global: cambiar el tamaño de la raíz redimensiona todo el documento de forma coherente.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.875&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;800px&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { :&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;1200px&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { :&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.125&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una práctica habitual: usar &lt;code&gt;rem&lt;/code&gt; para tipografía, &lt;code&gt;px&lt;/code&gt; para bordes y &lt;code&gt;em&lt;/code&gt; para &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;border-radius&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="unidades-relativas-al-viewport"&gt;Unidades relativas al viewport&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vw&lt;/code&gt; — 1% del ancho del viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vh&lt;/code&gt; — 1% del alto del viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmin&lt;/code&gt; — 1% de la dimensión más pequeña entre ancho y alto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmax&lt;/code&gt; — 1% de la dimensión más grande.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="calc-para-combinar-unidades"&gt;&lt;code&gt;calc()&lt;/code&gt; para combinar unidades&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;calc()&lt;/code&gt; permite operar entre unidades de distinta naturaleza, algo imposible de otra forma. Es muy útil para tipografía fluida:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;calc&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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:#e5c07b"&gt;vw&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="números-sin-unidad-y-line-height"&gt;Números sin unidad y &lt;code&gt;line-height&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Si declaras un número sin unidad en &lt;code&gt;line-height&lt;/code&gt;, este actúa como un &lt;strong&gt;factor multiplicador&lt;/strong&gt; del &lt;code&gt;font-size&lt;/code&gt; del elemento. Es la forma recomendada, porque cada descendiente calcula su propia altura de línea a partir de su tamaño de fuente.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;line-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.5&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="custom-properties-variables-css"&gt;Custom properties (variables CSS)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;variables CSS&lt;/strong&gt; se declaran con el prefijo &lt;code&gt;--&lt;/code&gt; y se consumen con la función &lt;code&gt;var()&lt;/code&gt;. A diferencia de las variables de un preprocesador, son dinámicas: viven en el DOM y respetan la cascada y la herencia.&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;--color-marca&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;--color-texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#1c2833&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:#e5c07b"&gt;panel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;solid&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;marca&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;&lt;code&gt;var()&lt;/code&gt; acepta un segundo argumento como valor de respaldo: &lt;code&gt;var(--color-secundario, #888)&lt;/code&gt; usará &lt;code&gt;#888&lt;/code&gt; si la variable no está definida.&lt;/p&gt;
&lt;h3 id="redefinir-variables-por-contexto"&gt;Redefinir variables por contexto&lt;/h3&gt;
&lt;p&gt;Como las variables respetan la cascada, puedes sobrescribirlas dentro de un bloque para crear temas locales. Aquí el mismo componente &lt;code&gt;.panel&lt;/code&gt; se reconfigura dentro de &lt;code&gt;.tema-oscuro&lt;/code&gt; cambiando solo las variables:&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;--fondo&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;--texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#111&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tema-oscuro&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;--fondo&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2c3e50&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;--texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&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:#e5c07b"&gt;panel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fondo&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&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;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;display:flex;gap:1rem;flex-wrap:wrap;"&gt;
 &lt;div style="background:#fff;color:#111;padding:1em;border-radius:.5em;border:1px solid #ddd;flex:1;min-width:180px;"&gt;
 &lt;strong&gt;Panel claro&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;Usa las variables por defecto de &lt;code&gt;:root&lt;/code&gt;.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div style="background:#2c3e50;color:#ecf0f1;padding:1em;border-radius:.5em;flex:1;min-width:180px;"&gt;
 &lt;strong&gt;Panel oscuro&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;Las mismas reglas, con las variables redefinidas.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El componente no cambió ni una línea: solo redefinimos las variables en un contenedor superior. Ese es el poder de combinar herencia y &lt;em&gt;custom properties&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;La cascada, la especificidad y la herencia forman el núcleo conceptual de CSS. Dominarlos te permite predecir qué regla gana sin recurrir a parches. Sumado a un buen uso de unidades relativas y variables, tienes la base para escribir estilos escalables y mantenibles.&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;🚀 Próximo en la serie: los &lt;strong&gt;selectores&lt;/strong&gt; de CSS, la herramienta con la que apuntamos con precisión a los elementos que queremos estilizar.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Resolución de Problemas: El Método Design Thinking</title><link>https://blog.dacadev.com/soft-skills/resolucion-de-problemas-design-thinking/</link><pubDate>Fri, 22 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/soft-skills/resolucion-de-problemas-design-thinking/</guid><dc:creator>Dacadev</dc:creator><category>habilidades blandas</category><description>Aprende a resolver problemas complejos en tecnología usando Design Thinking: observar, empatizar, idear, prototipar e iterar para crear soluciones reales.</description><media:content url="https://blog.dacadev.com/images/soft-skills/resolucion-problemas/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="#las-cinco-bases-del-método"&gt;Las Cinco Bases del Método&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#1-observar-y-empatizar-entender-el-entorno"&gt;1. Observar y Empatizar: Entender el Entorno&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#dimensiones-de-tu-plan-de-observación"&gt;Dimensiones de tu Plan de Observación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#comprender-el-contexto-de-raíz"&gt;Comprender el Contexto de Raíz&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-analizar-y-definir-llegar-al-corazón-del-problema"&gt;2. Analizar y Definir: Llegar al Corazón del Problema&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#investigación-360-datos-y-emociones"&gt;Investigación 360: Datos y Emociones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#definir-objetivos-y-pain-points"&gt;Definir Objetivos y &amp;ldquo;Pain Points&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-poder-de-los-insights"&gt;El Poder de los Insights&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-idear-de-dónde-vienen-las-grandes-ideas"&gt;3. Idear: ¿De Dónde Vienen las Grandes Ideas?&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-dimensión-interna"&gt;La Dimensión Interna&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-dimensión-externa"&gt;La Dimensión Externa&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#técnicas-de-brainstorming-lluvia-de-ideas"&gt;Técnicas de Brainstorming (Lluvia de Ideas)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#4-prototipado-tu-idea-en-acción"&gt;4. Prototipado: Tu Idea en Acción&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#5-testear-e-iterar-el-ingrediente-secreto"&gt;5. Testear e Iterar: El Ingrediente Secreto&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#reglas-de-oro-para-un-testeo-exitoso"&gt;Reglas de Oro para un Testeo Exitoso&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#iterar-para-la-excelencia"&gt;Iterar para la Excelencia&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#aplicando-el-design-thinking-en-tu-vida-profesional"&gt;Aplicando el Design Thinking en tu Vida Profesional&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Si alguna vez pasaste horas intentando arreglar un bug o construir una funcionalidad que al final el cliente no quería usar&amp;hellip; seguro sentiste la frustración de perder tiempo y energía. En el mundo de la tecnología, a menudo nos lanzamos a escribir código antes de entender realmente cuál es el problema que estamos resolviendo.&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;En este artículo exploraremos las bases de la &lt;strong&gt;resolución de problemas&lt;/strong&gt; utilizando el método de &lt;strong&gt;Design Thinking&lt;/strong&gt;. Aprenderás cómo observar el entorno, analizar el contexto de raíz, idear de forma creativa, crear prototipos efectivos y probarlos con usuarios reales para iterar y mejorar continuamente. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El desarrollo de software no es solo escribir código, configurar bases de datos o desplegar servicios. En el fondo, &lt;strong&gt;la programación es un ejercicio continuo de resolución de problemas&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Para no dar palos de ciego, existe una metodología que los diseñadores crearon y que los desarrolladores podemos adoptar con un éxito increíble: el &lt;strong&gt;Design Thinking&lt;/strong&gt;. Este método consiste en un enfoque centrado en las personas para resolver problemas complejos y se basa en observar y actuar de manera estructurada.&lt;/p&gt;
&lt;pre class="mermaid"&gt;mindmap
 root((Design Thinking))
 👁️ Observar
 Empatizar sin juzgar
 Alcance espacial y temporal
 Observación participante o encubierta
 🔍 Analizar
 Investigación profunda
 Datos cualitativos vs cuantitativos
 Objetivos e Insights
 💡 Idear
 Imaginación y Conocimiento
 Actitud proactiva
 Brainstorming estructurado
 🛠️ Prototipar
 Crear un MVP
 Transmitir el cómo y cuándo
 Documentar decisiones
 🔁 Testear e Iterar
 Feedback de usuarios reales
 No guiar al usuario
 Mejora continua
&lt;/pre&gt;

&lt;h2 id="las-cinco-bases-del-método"&gt;Las Cinco Bases del Método&lt;/h2&gt;
&lt;p&gt;El proceso de Design Thinking no es una línea recta, sino un ciclo continuo que puedes dividir en cinco fases fundamentales para observar y actuar:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Observar (Empatizar)&lt;/strong&gt;: examina tu entorno de manera atenta ¿Qué puedes mejorar? ¿Qué hace falta? ¿Qué problemas enfrentan los usuarios en su día a día?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analizar (Definir)&lt;/strong&gt;: descubre el porqué sucede la situación. Plasma el problema de forma explícita y llega a la raíz profunda del mismo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diseñar o generar una solución (Idear)&lt;/strong&gt;: sabiendo el cómo y el porqué de la situación, es momento de pensar en cómo solucionarlo sin temor a usar nuevas herramientas o metodologías.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Probar o hacer (Prototipar)&lt;/strong&gt;: tu diseño no puede quedarse en papel o en Figma; debes implementarlo en una versión preliminar para probarlo en el campo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback (Testear e Iterar)&lt;/strong&gt;: pon a prueba tu solución, recolecta comentarios y repite el proceso. Si algo no funciona, ¡la perseverancia es clave!&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Todos somos artistas y creadores en nuestro trabajo. Lo que más destaca a un programador no es solo su capacidad técnica de escribir código, sino su &lt;strong&gt;curiosidad&lt;/strong&gt; y &lt;strong&gt;acción&lt;/strong&gt;: interesarse por entender cómo funciona el entorno y no temer a probar nuevas ideas o a preguntar. 💡&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="1-observar-y-empatizar-entender-el-entorno"&gt;1. Observar y Empatizar: Entender el Entorno&lt;/h2&gt;
&lt;p&gt;Antes de escribir una sola línea de código, necesitas &lt;strong&gt;empatizar&lt;/strong&gt;. La empatía en el desarrollo de software comienza con &lt;strong&gt;no juzgar&lt;/strong&gt;. Esto significa que debes tratar de entender por qué los usuarios actúan de la manera en que lo hacen, incluso si a primera vista su flujo de trabajo te &lt;em&gt;parece ineficiente&lt;/em&gt; o &lt;em&gt;&amp;ldquo;incorrecto&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Para comenzar a observar con efectividad, necesitas trazar un plan claro de observación que responda a esta estructura:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi plan de observación se realizará durante &lt;strong&gt;X horas&lt;/strong&gt;, durante &lt;strong&gt;X días&lt;/strong&gt;, en el contexto del proceso &lt;strong&gt;Y&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="dimensiones-de-tu-plan-de-observación"&gt;Dimensiones de tu Plan de Observación&lt;/h3&gt;
&lt;p&gt;Al diseñar este plan, debes definir tres aspectos clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alcance espacial&lt;/strong&gt;: ¿Hasta dónde podrás o querrás observar físicamente o dentro del software? (Por ejemplo, un módulo específico, o la oficina de operaciones del cliente).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alcance temporal&lt;/strong&gt;: ¿Cuál es el tiempo límite o el plazo definido que pondrás para esta tarea de investigación?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursos disponibles&lt;/strong&gt;: ¿Qué herramientas tienes a mano (grabadoras de pantalla, métricas de Analytics, entrevistas) para cumplir el objetivo?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 O[🔭 Tipo de Observación] --&gt; P["👥 Participante\nInteractúas directamente con el entorno y los usuarios"]
 O --&gt; NP["🕵️ No Participante\nObservas desde fuera sin intervenir"]
 P --&gt; E["🤫 Encubierta\nLos usuarios no saben que estás evaluando el proceso"]
 P --&gt; NE["📢 No Encubierta\nLos usuarios saben que los estás observando"]
&lt;/pre&gt;

&lt;h3 id="comprender-el-contexto-de-raíz"&gt;Comprender el Contexto de Raíz&lt;/h3&gt;
&lt;p&gt;Para obtener una visión completa, es crucial interactuar con todos los actores involucrados. No todos ven el problema de la misma manera: un operador administrativo verá dolores muy diferentes a los de un gerente de ventas.&lt;/p&gt;
&lt;p&gt;Debes analizar el contexto desde tres perspectivas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;En la periferia&lt;/strong&gt;: observa las situaciones colaterales o indirectas que rodean el problema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En directo&lt;/strong&gt;: analiza las acciones justo en el momento en que ocurren.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Al margen&lt;/strong&gt;: detente a mirar los detalles que los usuarios dan por sentados pero que revelan fricción.&lt;/li&gt;
&lt;/ul&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;Una excelente práctica al iniciar un proyecto es realizar observaciones de forma &lt;strong&gt;participante y encubierta&lt;/strong&gt;. Mira el entorno interactuando como un usuario más o acompañando el proceso de forma natural sin condicionar las respuestas de la gente. Traza un &lt;strong&gt;mapa de actividad&lt;/strong&gt; (como un mapa de calor) de las fricciones cotidianas. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="2-analizar-y-definir-llegar-al-corazón-del-problema"&gt;2. Analizar y Definir: Llegar al Corazón del Problema&lt;/h2&gt;
&lt;p&gt;Una vez que has observado, tendrás un mar de notas y datos. El siguiente paso es empaparte del tema a profundidad y estructurar la información.&lt;/p&gt;
&lt;h3 id="investigación-360-datos-y-emociones"&gt;Investigación 360: Datos y Emociones&lt;/h3&gt;
&lt;p&gt;Antes de proponer una arquitectura de software o cambiar una base de datos, busca en la red todo lo relacionado con el problema. Revisa foros, documentación oficial de herramientas similares y fuentes confiables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fuentes académicas&lt;/strong&gt;: busca en herramientas como &lt;strong&gt;Google Scholar&lt;/strong&gt; o bases de datos especializadas para ver si alguien ya ha estudiado el problema y qué soluciones teóricas existen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clasificación de datos&lt;/strong&gt;: separa la información en &lt;strong&gt;cualitativa&lt;/strong&gt; (emociones de frustración de los usuarios, comentarios, opiniones) y &lt;strong&gt;cuantitativa&lt;/strong&gt; (tiempo de carga de una página, cantidad de clics, tasa de abandono).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La magia del análisis radica en encontrar la relación entre ambas: detrás de una métrica cuantitativa baja siempre hay una emoción cualitativa de frustración oculta.&lt;/p&gt;
&lt;h3 id="definir-objetivos-y-pain-points"&gt;Definir Objetivos y &amp;ldquo;Pain Points&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Con la información clasificada, es momento de definir tus &lt;strong&gt;objetivos&lt;/strong&gt;. Estos son los retos y mejoras que quieres lograr en el entorno, y deben cumplir con ser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retos reales&lt;/strong&gt;: deben empujarte a buscar soluciones creativas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medibles&lt;/strong&gt;: debes poder medir si tu software mejoró la métrica inicial.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claros&lt;/strong&gt;: cualquier miembro del equipo técnico o de negocio debe entenderlos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points (Puntos de Dolor)&lt;/strong&gt;: deben atacar problemas complejos pero que, al solucionarse, brinden una inmensa mejora al entorno.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 D[📊 Datos Cualitativos + Cuantitativos] --&gt; A{Análisis}
 A --&gt; O["🎯 Objetivos\n(Retos claros y medibles)"]
 A --&gt; I["🧠 Insights\n(Oraciones breves que invitan al cambio)"]
 O &amp; I --&gt; S[🚀 Solución de Impacto]
&lt;/pre&gt;

&lt;h3 id="el-poder-de-los-insights"&gt;El Poder de los Insights&lt;/h3&gt;
&lt;p&gt;Un &lt;strong&gt;insight&lt;/strong&gt; es una oración corta que resume un descubrimiento profundo y genera movimiento. Sirve como el puente emocional para tu equipo: si el objetivo no es atractivo y claro, tus compañeros de desarrollo no se sentirán emocionados de participar en el proyecto.&lt;/p&gt;
&lt;h2 id="3-idear-de-dónde-vienen-las-grandes-ideas"&gt;3. Idear: ¿De Dónde Vienen las Grandes Ideas?&lt;/h2&gt;
&lt;p&gt;La creatividad no es un superpoder de unos pocos elegidos. &lt;strong&gt;Si eres humano y trabajas en tecnología, ya eres creativo&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Para activar esta capacidad al máximo, debes equilibrar dos dimensiones:&lt;/p&gt;
&lt;h3 id="la-dimensión-interna"&gt;La Dimensión Interna&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Imaginación&lt;/strong&gt;: es innata en ti. No te cohíbas ni te limites a una sola forma de pensar. Pregúntate siempre: &lt;em&gt;¿cómo podría hacer esto de forma totalmente distinta?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conocimiento&lt;/strong&gt;: a mayor conocimiento técnico y de negocio, mejores ideas tendrás. Al saber cómo funcionan las herramientas a fondo, sabrás exactamente cómo mejorarlas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actitud&lt;/strong&gt;: esta es la más importante. De nada sirve tener la imaginación de un genio si no tienes la actitud de proponer, probar y equivocarte sin miedo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="la-dimensión-externa"&gt;La Dimensión Externa&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ambiente&lt;/strong&gt;: el espacio intangible. ¿Cómo es tu relación con tu equipo y con los usuarios? Un ambiente de confianza fomenta que las ideas fluyan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursos&lt;/strong&gt;: todo lo físico y disponible. Desde lápices y tableros virtuales (como Miro o Notion) hasta la documentación de APIs de terceros.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="técnicas-de-brainstorming-lluvia-de-ideas"&gt;Técnicas de Brainstorming (Lluvia de Ideas)&lt;/h3&gt;
&lt;p&gt;Para calentar el cerebro antes de idear, realiza pequeños ejercicios de 2 a 5 minutos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conectar y combinar&lt;/strong&gt;: toma dos conceptos totalmente ajenos (por ejemplo, &amp;ldquo;compresión de archivos&amp;rdquo; y &amp;ldquo;jardinería&amp;rdquo;) e intenta unirlos en una nueva idea.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Punto de vista ajeno&lt;/strong&gt;: piensa en el problema técnico actual e imagínate cómo lo resolvería alguien totalmente ajeno a la informática (por ejemplo, un chef o un piloto).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Si he visto más allá es porque estaba sentado en hombros de gigantes.&lt;/em&gt; — Isaac Newton&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Al realizar una lluvia de ideas formal con tu equipo, sigue estas pautas estrictas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Establece un foco pequeño y alcanzable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No juzgues ni descartes ninguna idea&lt;/strong&gt; en la fase de creación.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asegúrate de que todos participen&lt;/strong&gt; y anota absolutamente todo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtra las ideas con pragmatismo&lt;/strong&gt; después del ejercicio. Clasifícalas en un eje cartesiano donde el eje &lt;strong&gt;X&lt;/strong&gt; sea la viabilidad de implementación y el eje &lt;strong&gt;Y&lt;/strong&gt; sea el valor o importancia que aporta al usuario.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-prototipado-tu-idea-en-acción"&gt;4. Prototipado: Tu Idea en Acción&lt;/h2&gt;
&lt;p&gt;Una idea genial sin ejecutar no vale nada. En tecnología, esto se traduce en construir un &lt;strong&gt;MVP (Minimum Viable Product)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Al crear tu prototipo, asegúrate de &lt;strong&gt;documentar cada proceso&lt;/strong&gt;: el porqué decidiste un framework sobre otro, qué restricciones asumiste y qué decisiones de diseño tomaste.&lt;/p&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;No asumas que el usuario o el cliente va a entender cómo funciona tu prototipo si solo le muestras un boceto abstracto. Enfócate en hacerle entender cómo será la idea real y no dejes que solo se la imagine. ⚠️&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Si estás diseñando un producto digital:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diseña interfaces claras e interactivas (mockups o prototipos navegables de Figma).&lt;/li&gt;
&lt;li&gt;Asegúrate de transmitir no solo la funcionalidad pura, sino &lt;strong&gt;el cómo y cuándo se usaría&lt;/strong&gt; en el día a día.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-testear-e-iterar-el-ingrediente-secreto"&gt;5. Testear e Iterar: El Ingrediente Secreto&lt;/h2&gt;
&lt;p&gt;El testeo es el momento de la verdad. ¿Tu solución realmente funciona o solo era buena en tu cabeza?&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 T[🧪 Testeo en Campo] --&gt; D1[1. Dale el producto al usuario]
 T --&gt; D2[2. NO le digas cómo usarlo]
 T --&gt; D3["3. Pídele que piense en voz alta (análisis cognitivo)"]
 T --&gt; D4[4. Anota cada fricción, duda y comentario]
&lt;/pre&gt;

&lt;h3 id="reglas-de-oro-para-un-testeo-exitoso"&gt;Reglas de Oro para un Testeo Exitoso&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No le expliques al usuario cómo usar tu producto&lt;/strong&gt;: en la vida real, no estarás a su lado para guiarlo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deja que tome la iniciativa&lt;/strong&gt;: observa dónde hace clic primero, dónde se confunde y qué caminos toma.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pídele que hable en voz alta&lt;/strong&gt;: haz que te diga qué piensa y qué cree que pasará antes de presionar un botón.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registra todos los datos&lt;/strong&gt;: documenta fielmente qué funcionó, qué falló y qué emociones experimentó el usuario.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="iterar-para-la-excelencia"&gt;Iterar para la Excelencia&lt;/h3&gt;
&lt;p&gt;La iteración es el verdadero motor del &lt;strong&gt;Design Thinking&lt;/strong&gt;. Rara vez una solución funciona de forma impecable en la primera prueba.&lt;/p&gt;
&lt;p&gt;Analiza los datos recopilados y decide qué modificaciones necesita el software para cumplir el objetivo inicial. A veces, el testeo demostrará que la idea no es viable, y &lt;strong&gt;eso está perfectamente bien&lt;/strong&gt;. Saber pivotar a tiempo con madurez profesional es parte del éxito de cualquier desarrollador.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="aplicando-el-design-thinking-en-tu-vida-profesional"&gt;Aplicando el Design Thinking en tu Vida Profesional&lt;/h2&gt;
&lt;p&gt;¿Cómo se conecta este flujo con tu rol diario como programador?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Antes de programar un feature&lt;/strong&gt;: sal de tu editor de código y observa cómo los usuarios hacen esa tarea manualmente hoy en día (Empatizar).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Al diseñar la base de datos&lt;/strong&gt;: investiga las mejores prácticas y fuentes oficiales, clasificando las restricciones técnicas antes de empezar (Definir).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En las reuniones de arquitectura&lt;/strong&gt;: fomenta espacios de lluvia de ideas combinando patrones existentes sin juzgar prematuramente (Idear).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durante el ciclo de desarrollo&lt;/strong&gt;: construye maquetas rápidas antes de comprometerte con una infraestructura compleja (Prototipar).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En los code reviews y despliegues&lt;/strong&gt;: analiza el feedback de tus compañeros y usuarios finales de forma objetiva para refinar el código (Testear e Iterar).&lt;/li&gt;
&lt;/ul&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;La resolución de problemas con &lt;strong&gt;Design Thinking&lt;/strong&gt; no es un método rígido, sino una mentalidad de curiosidad y adaptabilidad. Al aplicarlo de forma sistemática en tus desarrollos, dejarás de ser un simple escritor de código y te convertirás en un verdadero &lt;strong&gt;creador de soluciones con propósito&lt;/strong&gt;. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Agentes Especializados: Colaboración Multi-Agente y Nuevas Fronteras</title><link>https://blog.dacadev.com/generative-ai/agents/agentes-especializados-multi-agente/</link><pubDate>Thu, 21 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/agents/agentes-especializados-multi-agente/</guid><dc:creator>Dacadev</dc:creator><category>inteligencia artificial generativa</category><description>Descubre las fronteras de la IA con agentes especializados. Aprende sobre colaboración multi-agente, agentes multimodales, coding agents y agentes ultra-eficientes (Tiny Agents).</description><media:content url="https://blog.dacadev.com/images/generative-ai/agents/03-agentes-especializados/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="#el-universo-de-los-agentes-especializados"&gt;El Universo de los Agentes Especializados&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#colaboración-multi-agente-agente-único-vs-multi-agente"&gt;Colaboración Multi-Agente: Agente Único vs. Multi-Agente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-arquitectura-del-agente-supervisor-supervisor-agent"&gt;La Arquitectura del Agente Supervisor (Supervisor Agent)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-agente-multimodal"&gt;El Agente Multimodal&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-coding-agent-agente-de-programación"&gt;El Coding Agent (Agente de Programación)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#tiny-agents-resolviendo-la-eficiencia-y-los-costos"&gt;Tiny Agents: Resolviendo la Eficiencia y los Costos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-creación-de-modelos-más-pequeños-distillation"&gt;1. Creación de Modelos más Pequeños (Distillation)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-arquitecturas-de-llm-más-eficientes-moe-y-ssm"&gt;2. Arquitecturas de LLM más Eficientes (MoE y SSM)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-disminución-del-costo-de-inferencia-speculative-decoding"&gt;3. Disminución del Costo de Inferencia (Speculative Decoding)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#4-modelos-con-mayor-performance-en-razonamiento-hierarchical-decoding"&gt;4. Modelos con Mayor Performance en Razonamiento (Hierarchical Decoding)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&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;Cuando un solo agente de &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt; intenta hacerlo todo —desde buscar en internet y escribir código hasta redactar correos o gestionar la base de datos—, suele toparse con un cuello de botella. Al igual que en un equipo de desarrollo de software no le pedirías a un diseñador UX que configure el cluster de Kubernetes, en la &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt; el futuro pertenece a los &lt;strong&gt;Agentes Especializados&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;¿Cómo logramos que múltiples agentes colaboren entre sí de forma armoniosa?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Qué nuevas capacidades traen los agentes multimodales y de programación?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Y cómo resolvemos el gran problema del costo y consumo de tokens de estos sistemas?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&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;En este artículo profundizaremos enlos agentes especializados. Exploraremos la arquitectura de colaboración &lt;strong&gt;Multi-Agente&lt;/strong&gt;, descubriremos el potencial de los &lt;strong&gt;Agentes Multimodales&lt;/strong&gt; y &lt;strong&gt;Coding Agents&lt;/strong&gt;, y analizaremos las estrategias para construir &lt;strong&gt;Tiny Agents&lt;/strong&gt; sumamente eficientes. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="el-universo-de-los-agentes-especializados"&gt;El Universo de los Agentes Especializados&lt;/h2&gt;
&lt;p&gt;A medida que las necesidades de automatización se vuelven más complejas, los desarrolladores de IA hemos aprendido a fragmentar los problemas en lugar de crear un único agente monolítico. Esto nos lleva a cuatro categorías principales de especialización:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 %% Categorías de Agentes Especializados
 Root[🧬 Agentes Especializados]

 Root --&gt; MAC[🤝 Colaboración Multi-Agente]
 Root --&gt; MM[👁️ Agentes Multimodales]
 Root --&gt; CA[💻 Coding Agents]
 Root --&gt; TA["⚡ Tiny Agents (Eficiencia)"]

 MAC --&gt; MAC_Desc["Agentes que dividen tareas y colaboran entre sí"]
 MM --&gt; MM_Desc["Comprenden y generan texto, audio, imagen y video"]
 CA --&gt; CA_Desc["Escriben, ejecutan y auto-depuran código"]
 TA --&gt; TA_Desc["Modelos compactos optimizados para bajo costo e inferencia rápida"]
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="colaboración-multi-agente-agente-único-vs-multi-agente"&gt;Colaboración Multi-Agente: Agente Único vs. Multi-Agente&lt;/h2&gt;
&lt;p&gt;En un sistema de &lt;strong&gt;Agente Único (Single Agent)&lt;/strong&gt;, un solo LLM generalista se encarga de procesar la consulta, gestionar la memoria, seleccionar las herramientas y generar el plan final. Aunque es un diseño sencillo y efectivo para tareas contenidas, genera una enorme presión sobre la ventana de contexto del modelo y aumenta drásticamente el riesgo de alucinaciones a medida que sumamos más herramientas al arsenal.&lt;/p&gt;
&lt;p&gt;Por el contrario, un &lt;strong&gt;Sistema Multi-Agente (Multi-Agent System)&lt;/strong&gt; divide las responsabilidades entre varios agentes especializados que interactúan entre sí. Cada agente cuenta con un rol definido, una memoria local ajustada a su función y un conjunto limitado de herramientas específicas. Esto reduce el ruido, optimiza el tamaño de los prompts y permite estructurar flujos de trabajo altamente modulares.&lt;/p&gt;
&lt;p&gt;Comparemos estas dos aproximaciones de manera visual:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Multi["Sistema Multi-Agente (Multi-Agent)"]
 direction TB
 Q2[👤 Consulta] --&gt; Supervisor[👑 Agente Supervisor]
 Supervisor &lt;--&gt; AgentA[💻 Agente de Código]
 Supervisor &lt;--&gt; AgentB[💬 Agente de Mensajería]
 Supervisor &lt;--&gt; AgentC[🔍 Agente de Búsqueda]
 AgentA &amp; AgentB &amp; AgentC --&gt; Ans2[🎯 Respuesta]
 end

 subgraph Single["Un Solo Agente (Single Agent)"]
 direction TB
 Q1[👤 Consulta] --&gt; SA[🧠 Agente Generalista]
 subgraph SABrain["Cerebro Complejo"]
 direction LR
 LLM1[Reasoning LLM] --- Mem1[(Memoria)]
 LLM1 --- Tools1[🔧 Herramientas]
 LLM1 --- Plan1[📋 Planificación]
 end
 SA --&gt; Ans1[🎯 Respuesta]
 end
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="la-arquitectura-del-agente-supervisor-supervisor-agent"&gt;La Arquitectura del Agente Supervisor (Supervisor Agent)&lt;/h2&gt;
&lt;p&gt;Uno de los patrones de diseño más exitosos en sistemas multi-agente es el de &lt;strong&gt;Agente Supervisor (Supervisor Agent)&lt;/strong&gt;. En este patrón, el supervisor actúa como el &amp;ldquo;director de orquesta&amp;rdquo; o el gestor principal del equipo de desarrollo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El &lt;strong&gt;Supervisor&lt;/strong&gt; recibe la consulta compleja del usuario.&lt;/li&gt;
&lt;li&gt;Analiza qué sub-tareas se necesitan resolver para cumplir la meta y descompone el problema general.&lt;/li&gt;
&lt;li&gt;Asigna cada sub-tarea al agente especialista correspondiente (el Agente de Código, de Búsqueda o de Mensajería), tratándolos prácticamente como si fueran &amp;ldquo;herramientas avanzadas&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Los agentes especialistas procesan las sub-tareas utilizando sus &lt;strong&gt;herramientas específicas&lt;/strong&gt; y devuelven el resultado al supervisor.&lt;/li&gt;
&lt;li&gt;El supervisor consolida las respuestas parciales y, si es necesario, replanifica el flujo antes de entregar la respuesta definitiva al usuario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En este modelo, el &lt;strong&gt;Agente Supervisor&lt;/strong&gt; suele estar respaldado por el LLM más potente debido a la complejidad que requiere la planificación y asignación de tareas, mientras que los especialistas pueden funcionar perfectamente con modelos más rápidos y económicos.&lt;/p&gt;
&lt;p&gt;Observemos esta sofisticada estructura jerárquica en acción:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 Query[👤 Consulta / Query] --&gt; Sup[👑 Agente Supervisor]

 subgraph SupTools["Agentes como Herramientas (Supervisor)"]
 Sup --- ToolC[💻 Coding Tool]
 Sup --- ToolM[💬 Messaging Tool]
 Sup --- ToolS[🔍 Search Tool]
 end

 Sup &lt;--&gt; CA[💻 Coding Agent]
 Sup &lt;--&gt; MA[💬 Messaging Agent]
 Sup &lt;--&gt; SA[🔍 Search Agent]

 subgraph CATools["Herramientas del Agente de Código"]
 CA --- T_Py[🐍 python]
 CA --- T_VS[💻 vscode]
 CA --- T_GH[🐙 github]
 end

 subgraph MATools["Herramientas de Mensajería"]
 MA --- T_Sl[💬 slack]
 MA --- T_Ds[👾 discord]
 end

 subgraph SATools["Herramientas de Búsqueda"]
 SA --- T_Go[🔍 google]
 SA --- T_Ar[📄 ArXiv]
 SA --- T_Wi[🌐 Wikipedia]
 end
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="el-agente-multimodal"&gt;El Agente Multimodal&lt;/h2&gt;
&lt;p&gt;El mundo real y la web digital no se componen únicamente de texto plano. Para interactuar plenamente con nuestro entorno, necesitamos agentes capaces de operar en múltiples formatos de datos. Aquí es donde los &lt;strong&gt;Agentes Multimodales&lt;/strong&gt; están ganando un enorme terreno.&lt;/p&gt;
&lt;p&gt;La capacidad de que un agente sea multimodal depende enteramente del LLM que actúe como su &amp;ldquo;cerebro&amp;rdquo;. Definimos a un agente como multimodal cuando su modelo subyacente es capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comprender múltiples modalidades (Entrada/Input)&lt;/strong&gt;: El modelo procesa de forma nativa imágenes, archivos PDF estructurados, diagramas, flujos de audio o incluso video sin necesidad de convertirlos previamente a texto mediante software secundario OCR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generar múltiples modalidades (Salida/Output)&lt;/strong&gt;: El agente puede responder dibujando diagramas, generando archivos de audio estructurados, creando código visual interactivo o interactuando directamente en interfaces visuales de usuario (mediante herramientas de &lt;em&gt;Computer Use&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="el-coding-agent-agente-de-programación"&gt;El Coding Agent (Agente de Programación)&lt;/h2&gt;
&lt;p&gt;Uno de los tipos de agentes especializados más populares es el &lt;strong&gt;Coding Agent&lt;/strong&gt;. A diferencia de los asistentes de chat tradicionales (que se limitan a dar sugerencias de código en una ventana de conversación estática), un Coding Agent opera de forma activa sobre entornos de desarrollo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lectura e investigación&lt;/strong&gt;: Lee el código fuente del repositorio y comprende la arquitectura general.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planificación y desarrollo&lt;/strong&gt;: Escribe nuevas funciones, modifica archivos específicos y gestiona el flujo de control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ejecución y pruebas&lt;/strong&gt;: Ejecuta compiladores y motores de pruebas unitarias locales para validar sus cambios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-depuración (Self-debugging)&lt;/strong&gt;: Si el compilador o las pruebas devuelven un error, el agente analiza el mensaje de salida, actualiza su plan, corrige su código y vuelve a ejecutar las pruebas hasta lograr que todo compile y funcione de forma exitosa.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tiny-agents-resolviendo-la-eficiencia-y-los-costos"&gt;Tiny Agents: Resolviendo la Eficiencia y los Costos&lt;/h2&gt;
&lt;p&gt;Aunque los sistemas agénticos son sumamente potentes, tienen un gran inconveniente oculto: &lt;strong&gt;el costo&lt;/strong&gt;. Un agente autónomo puede tomar docenas de pasos secuenciales para resolver una tarea, consumiendo millones de tokens en el proceso sin que el desarrollador o usuario puedan anticipar la cantidad exacta de antemano.&lt;/p&gt;
&lt;p&gt;Para evitar que el uso y costo de agentes se salga de control, la comunidad científica de IA ha desarrollado los &lt;strong&gt;Tiny Agents&lt;/strong&gt;: agentes ultra-eficientes y veloces basados en modelos pequeños optimizados para tareas muy puntuales.&lt;/p&gt;
&lt;p&gt;Existen cuatro categorías clave donde podemos buscar optimizaciones para nuestros agentes:&lt;/p&gt;
&lt;h3 id="1-creación-de-modelos-más-pequeños-distillation"&gt;1. Creación de Modelos más Pequeños (Distillation)&lt;/h3&gt;
&lt;p&gt;Mediante técnicas de &lt;strong&gt;destilación de conocimiento (knowledge distillation)&lt;/strong&gt;, podemos entrenar un modelo pequeño (ej. de 1.5B o 3B parámetros) utilizando las respuestas detalladas y las trayectorias de razonamiento generadas por modelos gigantes (ej. de 405B parámetros). De esta manera, el modelo compacto conserva una alta tasa de acierto en tareas específicas pero a una fracción del costo y tamaño.&lt;/p&gt;
&lt;h3 id="2-arquitecturas-de-llm-más-eficientes-moe-y-ssm"&gt;2. Arquitecturas de LLM más Eficientes (MoE y SSM)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mixture of Experts (MoE)&lt;/strong&gt;: Modelos que solo activan una pequeña porción de sus redes neuronales (los &amp;ldquo;expertos&amp;rdquo;) para procesar un token específico, logrando una altísima velocidad de inferencia a bajo costo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Space Models (SSM)&lt;/strong&gt;: Arquitecturas alternativas a los &lt;em&gt;Transformers&lt;/em&gt; tradicionales (como &lt;em&gt;Mamba&lt;/em&gt;) que eliminan el crecimiento cuadrático del costo computacional de la atención en textos extremadamente largos, ideales para procesar enormes repositorios o históricos de conversación.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-disminución-del-costo-de-inferencia-speculative-decoding"&gt;3. Disminución del Costo de Inferencia (Speculative Decoding)&lt;/h3&gt;
&lt;p&gt;La &lt;strong&gt;decodificación especulativa (speculative decoding)&lt;/strong&gt; utiliza un modelo &amp;ldquo;asistente&amp;rdquo; sumamente pequeño y rápido para predecir (borrador) secuencialmente varios tokens de respuesta de manera rápida. Luego, el LLM principal (más grande y preciso) evalúa y valida estos tokens especulados en un solo paso paralelo, acelerando drásticamente el tiempo de generación final.&lt;/p&gt;
&lt;h3 id="4-modelos-con-mayor-performance-en-razonamiento-hierarchical-decoding"&gt;4. Modelos con Mayor Performance en Razonamiento (Hierarchical Decoding)&lt;/h3&gt;
&lt;p&gt;Consiste en implementar patrones lógicos jerárquicos y recursivos donde el agente descompone internamente el problema de forma recursiva antes de generar texto, evitando la generación redundante de tokens innecesarios y optimizando cada paso de inferencia al máximo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El camino de los sistemas monolíticos hacia las redes de &lt;strong&gt;Agentes Especializados&lt;/strong&gt; es una evolución natural y sumamente emocionante. Al combinar la orquestación modular de &lt;strong&gt;sistemas multi-agente&lt;/strong&gt;, la flexibilidad de las capacidades &lt;strong&gt;multimodales&lt;/strong&gt; y las optimizaciones de costo de los &lt;strong&gt;Tiny Agents&lt;/strong&gt;, podemos diseñar soluciones de Inteligencia Artificial que no solo parezcan sacadas de la ciencia ficción, sino que sean escalables, rentables y robustas en el mundo real.&lt;/p&gt;
&lt;p&gt;¡Con este artículo cerramos nuestra trilogía introductoria sobre la teoría y arquitectura de agentes de Inteligencia Artificial! En los próximos tutoriales prácticos empezaremos a picar código y a construir nuestros propios agentes colaborativos. ¡Manos a la obra!&lt;/p&gt;</content:encoded></item><item><title>Tablas Hash, Pilas y Colas: Estructuras de Datos de Alto Rendimiento</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/03-hash-tables-stacks-y-queues/</link><pubDate>Tue, 19 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/03-hash-tables-stacks-y-queues/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende el funcionamiento interno de las Tablas Hash, Hashing y Colisiones. Guía práctica y visual de Stacks (Pilas) y Queues (Colas) en TypeScript.</description><media:content url="https://blog.dacadev.com/images/programming/structures-algorithms/03-hash-tables-stacks-queues/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="#1-qué-es-una-tabla-hash-hash-table"&gt;1. ¿Qué es una Tabla Hash (Hash Table)?&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#cómo-funciona-el-hashing"&gt;¿Cómo funciona el Hashing?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#colisiones-y-load-factor"&gt;Colisiones y Load Factor&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#eficiencia-de-las-operaciones-en-una-hash-table"&gt;Eficiencia de las Operaciones en una Hash Table&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejemplo-práctico-optimizando-código-con-tablas-hash"&gt;Ejemplo Práctico: Optimizando código con Tablas Hash&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-versión-lenta-on-cdot-m---bucles-anidados"&gt;La versión lenta (O(N \cdot M)) - Bucles anidados:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-versión-veloz-on--m---usando-una-tabla-hash"&gt;La versión veloz (O(N + M)) - Usando una Tabla Hash:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#pilas-stacks"&gt;Pilas (Stacks)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sus-3-reglas-de-oro"&gt;Sus 3 Reglas de Oro:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#colas-queues"&gt;Colas (Queues)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sus-3-reglas-de-oro-1"&gt;Sus 3 Reglas de Oro:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Hasta ahora hemos visto estructuras secuenciales como los Arrays, donde buscar un elemento requiere revisar celda por celda &lt;em&gt;O(N)&lt;/em&gt; o usar búsqueda binaria &lt;em&gt;O(log N)&lt;/em&gt; si están ordenados. Pero, ¿qué pasaría si te dijera que existe una estructura capaz de buscar, insertar y borrar datos en &lt;strong&gt;un solo paso &lt;em&gt;O(1)&lt;/em&gt;&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Hoy explicaremos las &lt;strong&gt;Tablas Hash (Hash Tables)&lt;/strong&gt;,las &lt;strong&gt;Pilas (Stacks)&lt;/strong&gt; y las &lt;strong&gt;Colas (Queues)&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-qué-es-una-tabla-hash-hash-table"&gt;1. ¿Qué es una Tabla Hash (Hash Table)?&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;Tabla Hash&lt;/strong&gt; (conocida en Python como &lt;em&gt;diccionario&lt;/em&gt;, en JavaScript como &lt;em&gt;objeto&lt;/em&gt; o &lt;em&gt;Map&lt;/em&gt;, y en Go como &lt;em&gt;map&lt;/em&gt;) es una estructura que asocia &lt;strong&gt;claves (keys)&lt;/strong&gt; con &lt;strong&gt;valores (values)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A diferencia de los Arrays, donde los elementos están ordenados por índices numéricos continuos, las Tablas Hash son estructuras no ordenadas. Su velocidad absurda radica en su proceso interno: el &lt;strong&gt;Hashing&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="cómo-funciona-el-hashing"&gt;¿Cómo funciona el Hashing?&lt;/h3&gt;
&lt;p&gt;Cuando guardamos un dato en una Tabla Hash (por ejemplo, &lt;code&gt;{&amp;quot;cab&amp;quot; =&amp;gt; &amp;quot;taxi&amp;quot;}&lt;/code&gt;), la computadora no busca una celda libre al azar. Utiliza una &lt;strong&gt;función hash (hash function)&lt;/strong&gt; para convertir la clave de texto en un índice numérico específico.&lt;/p&gt;
&lt;p&gt;Supongamos que inventamos una función hash súper simple que suma el valor alfabético de las letras de la clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;A = 1, B = 2, C = 3, D = 4, E = 5&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si guardamos la clave &lt;code&gt;&amp;quot;ACE&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;A(1) + C(3) + E(5) = 9&lt;/em&gt;. El valor se almacena en el índice &lt;strong&gt;9&lt;/strong&gt; de nuestra memoria física.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si guardamos &lt;code&gt;&amp;quot;CAB&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;C(3) + A(1) + B(2) = 6&lt;/em&gt;. El valor se almacena en el índice &lt;strong&gt;6&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 Key["Clave: 'ACE'"] --&gt; HashFunc["Función Hash&lt;br/&gt;(Suma de letras)"]
 HashFunc --&gt; Index["Índice: 9"]
 Index --&gt; Memory["[Celda 9] = 'star'"]
&lt;/pre&gt;

&lt;p&gt;Cuando quieres buscar el valor asociado a &lt;code&gt;&amp;quot;ACE&amp;quot;&lt;/code&gt;, la computadora no recorre toda la tabla. Simplemente calcula de nuevo &lt;code&gt;Hash(&amp;quot;ACE&amp;quot;) = 9&lt;/code&gt; y accede de forma instantánea al índice 9 en &lt;strong&gt;1 paso (O(1))&lt;/strong&gt;. ¡Es brillante!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="colisiones-y-load-factor"&gt;Colisiones y Load Factor&lt;/h2&gt;
&lt;p&gt;¿Qué pasa si intentamos insertar &lt;code&gt;&amp;quot;DAB&amp;quot;&lt;/code&gt; en nuestro ejemplo anterior?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;D(4) + A(1) + B(2) = 7&lt;/em&gt;
¿Y si intentamos insertar &lt;code&gt;&amp;quot;BAD&amp;quot;&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;&lt;em&gt;B(2) + A(1) + D(4) = 7&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambas claves dan el mismo índice, a esto se le conoce como &lt;strong&gt;Colisión Hash&lt;/strong&gt;. Cuando esto ocurre, la celda 7 debe almacenar una sub-lista de valores, lo que degrada el rendimiento de la búsqueda.&lt;/p&gt;
&lt;p&gt;Para evitar colisiones en la vida real, las funciones hash usan matemáticas complejas y se rigen por la regla del &lt;strong&gt;Factor de Carga (Load Factor)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La proporción ideal es tener &lt;strong&gt;10 celdas de memoria por cada 7 elementos&lt;/strong&gt; almacenados (un factor de carga de 0.7). Esto mantiene un equilibrio perfecto entre uso de memoria y prevención de colisiones.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="eficiencia-de-las-operaciones-en-una-hash-table"&gt;Eficiencia de las Operaciones en una Hash Table&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operación&lt;/th&gt;
 &lt;th&gt;Por Clave (Key)&lt;/th&gt;
 &lt;th&gt;Por Valor (Value)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Búsqueda&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt; (Constante)&lt;/td&gt;
 &lt;td&gt;O(N) (Lineal)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Inserción&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt; (Constante)&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Eliminación&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt; (Constante)&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&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;La búsqueda de &lt;em&gt;O(1)&lt;/em&gt; solo funciona en &lt;strong&gt;una dirección&lt;/strong&gt;: desde la clave al valor. Si necesitas buscar una clave a partir de su valor, la computadora obligatoriamente deberá recorrer toda la estructura de forma lineal (O(N)).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="ejemplo-práctico-optimizando-código-con-tablas-hash"&gt;Ejemplo Práctico: Optimizando código con Tablas Hash&lt;/h2&gt;
&lt;p&gt;Imagina que debes escribir una función en TypeScript que determine si un arreglo es un subconjunto de otro (es decir, si todos los elementos de un arreglo &lt;code&gt;array2&lt;/code&gt; existen en &lt;code&gt;array1&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="la-versión-lenta-on-cdot-m---bucles-anidados"&gt;La versión lenta (O(N \cdot M)) - Bucles anidados:&lt;/h3&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;isSubsetSlow&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[], &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;// Compara cada elemento del segundo arreglo contra todos los del primero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;val2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;found&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;val1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;val2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#e06c75"&gt;val1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;found&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;break&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;if&lt;/span&gt; (&lt;span style="color:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e06c75"&gt;found&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&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;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&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;h3 id="la-versión-veloz-on--m---usando-una-tabla-hash"&gt;La versión veloz (O(N + M)) - Usando una Tabla Hash:&lt;/h3&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;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;isSubsetFast&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt; &lt;span style="color:#e06c75"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PropertyKey&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[], &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&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;hashTable&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;boolean&lt;/span&gt;&amp;gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; {} &lt;span style="color:#c678dd"&gt;as&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;boolean&lt;/span&gt;&amp;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:#7f848e"&gt;// Guardamos todos los elementos de arr1 en la tabla hash en O(N)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;hashTable&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:#e5c07b"&gt;true&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:#7f848e"&gt;// Comprobamos la existencia de arr2 en O(M)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e06c75"&gt;hashTable&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:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&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;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&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;Al transformar la búsqueda lineal anidada en una búsqueda instantánea en una Tabla Hash, convertimos un algoritmo pesado de complejidad multiplicativa a uno de complejidad sumatoria. ¡Es la diferencia entre que un proceso tarde horas o milisegundos!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pilas-stacks"&gt;Pilas (Stacks)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;Pilas (Stacks)&lt;/strong&gt; son una estructura de datos abstracta y altamente restrictiva. A diferencia de un Array normal donde puedes leer o insertar en cualquier parte, en un Stack las reglas son estrictas.&lt;/p&gt;
&lt;p&gt;Se rigen bajo el principio &lt;strong&gt;LIFO (Last In, First Out)&lt;/strong&gt;: el último elemento en entrar es el primero en salir. Imagínalo como una pila de platos en un restaurante, solo puedes interactuar con el plato de arriba.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Pila Stack - LIFO
 direction TB
 E3["[Plato 3] &lt;-- Cima (Peek/Pop)"]
 E2["[Plato 2]"]
 E1["[Plato 1] &lt;-- Base"]
 end
&lt;/pre&gt;

&lt;h3 id="sus-3-reglas-de-oro"&gt;Sus 3 Reglas de Oro:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Los datos solo se pueden insertar al final (&lt;strong&gt;Push&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Los datos solo se pueden eliminar del final (&lt;strong&gt;Pop&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Solo se puede leer el último elemento (&lt;strong&gt;Peek&lt;/strong&gt; o Cima).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;¿Por qué usar una estructura tan restrictiva?&lt;/strong&gt;
Porque nos da seguridad. Al restringir las operaciones de acceso, garantizamos que nadie pueda corromper el orden de los datos intermedios. Es el motor detrás del botón &amp;ldquo;Deshacer&amp;rdquo; (Ctrl+Z) de tu editor de texto y del &lt;strong&gt;Call Stack&lt;/strong&gt; de tu procesador.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="colas-queues"&gt;Colas (Queues)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;Colas (Queues)&lt;/strong&gt; son la contraparte directa del Stack. Representan fielmente la fila de un banco o supermercado.&lt;/p&gt;
&lt;p&gt;Se rigen por el principio &lt;strong&gt;FIFO (First In, First Out)&lt;/strong&gt;: el primer elemento en llegar es el primero en ser atendido.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 subgraph Cola Queue - FIFO
 direction LR
 S1["[Cliente 1] En cabeza (Atender/Dequeue)"] --&gt; S2["[Cliente 2]"] --&gt; S3["[Cliente 3] En cola (Llegada/Enqueue)"]
 end
&lt;/pre&gt;

&lt;h3 id="sus-3-reglas-de-oro-1"&gt;Sus 3 Reglas de Oro:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Los datos solo se insertan al final (&lt;strong&gt;Enqueue&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Los datos solo se eliminan del inicio (&lt;strong&gt;Dequeue&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Solo se puede leer el elemento del inicio.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Casos de uso comunes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Colas de impresión: los documentos se imprimen exactamente en el orden en que fueron enviados.&lt;/li&gt;
&lt;li&gt;Gestión de tareas asíncronas en servidores web (Message Queues).&lt;/li&gt;
&lt;li&gt;Procesos de background en sistemas operativos.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Entendiendo la Notación Big O y los Algoritmos de Ordenamiento Básicos</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/02-big-o-notation-y-algoritmos-de-ordenamiento/</link><pubDate>Mon, 18 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/02-big-o-notation-y-algoritmos-de-ordenamiento/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a analizar la complejidad temporal de tu código con Big O. Explicación paso a paso de Bubble Sort, Selection Sort e Insertion Sort con ejemplos en Python.</description><media:content url="https://blog.dacadev.com/images/programming/structures-algorithms/02-big-o-and-sorting-algorithms/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é-es-la-notación-big-o"&gt;¿Qué es la Notación Big O?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#1-ordenamiento-burbuja-bubble-sort"&gt;1. Ordenamiento Burbuja (Bubble Sort)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-proceso-paso-a-paso"&gt;El proceso paso a paso:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-en-python"&gt;Implementación en Python:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#eficiencia-de-bubble-sort"&gt;Eficiencia de Bubble Sort&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-ordenamiento-por-selección-selection-sort"&gt;2. Ordenamiento por Selección (Selection Sort)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-proceso-paso-a-paso-1"&gt;El proceso paso a paso:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-en-python-1"&gt;Implementación en Python:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#eficiencia-de-selection-sort"&gt;Eficiencia de Selection Sort&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-optimizando-para-escenarios-optimistas-insertion-sort"&gt;3. Optimizando para Escenarios Optimistas (Insertion Sort)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-proceso-paso-a-paso-2"&gt;El proceso paso a paso:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-en-python-2"&gt;Implementación en Python:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-gran-revelación-el-impacto-de-los-escenarios"&gt;La gran revelación: El impacto de los escenarios&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#por-qué-insertion-sort-es-tan-especial"&gt;¿Por qué Insertion Sort es tan especial?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;¿Cómo podemos comparar dos algoritmos de manera formal? En el &lt;a href="https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/01-estructuras-de-datos-y-algoritmos-fundamentos"



 


&gt;post anterior&lt;/a&gt;, vimos que contar los segundos es una mala idea porque depende del hardware. Aprendimos que contar los &lt;strong&gt;pasos&lt;/strong&gt; es el camino correcto.&lt;/p&gt;
&lt;p&gt;Hoy aprenderemos a usar la &lt;strong&gt;Notación Big O&lt;/strong&gt;, el estándar que usamos en la industria para catalogar la eficiencia del software, y la aplicaremos analizando tres algoritmos de ordenamiento clásicos: &lt;strong&gt;Bubble Sort&lt;/strong&gt;, &lt;strong&gt;Selection Sort&lt;/strong&gt; e &lt;strong&gt;Insertion Sort&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-la-notación-big-o"&gt;¿Qué es la Notación Big O?&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;Notación Big O&lt;/strong&gt; es una herramienta matemática que describe la eficiencia de un algoritmo en función de cómo crece su número de pasos a medida que el tamaño de los datos de entrada (denotado como &lt;strong&gt;N&lt;/strong&gt;) aumenta.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No nos dice la cantidad exacta de milisegundos que tardará un programa, sino &lt;strong&gt;la relación de crecimiento&lt;/strong&gt; entre el volumen de datos y el esfuerzo del procesador.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Los tres perfiles más comunes que hemos visto hasta ahora son:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;O(1) - Tiempo Constante&lt;/strong&gt;: El algoritmo siempre requiere la misma cantidad de pasos, sin importar si N es 10 o 10 millones (por ejemplo, leer un índice en un Array).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O(N) - Tiempo Lineal&lt;/strong&gt;: El número de pasos crece en proporción directa a los datos (por ejemplo, buscar un elemento mediante Búsqueda Lineal).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O(log N) - Tiempo Logarítmico&lt;/strong&gt;: El algoritmo es sumamente eficiente. Cada vez que duplicamos los datos, solo se agrega &lt;strong&gt;un paso&lt;/strong&gt; más al total (por ejemplo, la Búsqueda Binaria).&lt;/li&gt;
&lt;/ol&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;&lt;strong&gt;Nota matemática:&lt;/strong&gt; El logaritmo usado en Big O es en &lt;strong&gt;base 2&lt;/strong&gt; (log₂ N), no en base 10. Representa cuántas veces puedes dividir N a la mitad antes de llegar a 1.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Veamos gráficamente cómo se comparan estas curvas de crecimiento:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Eficiencia de Algoritmos
 direction TB
 C1["Excelente: O(1)"]
 C2["Muy Bueno: O(log N)"]
 C3["Aceptable: O(N)"]
 C4["Ineficiente: O(N²)"]
 end
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Curvas de crecimiento de Big O&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-ordenamiento-burbuja-bubble-sort"&gt;1. Ordenamiento Burbuja (Bubble Sort)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bubble Sort&lt;/strong&gt; es uno de los algoritmos de ordenamiento más simples e intuitivos. Se llama &amp;ldquo;Burbuja&amp;rdquo; porque los valores más altos van &amp;ldquo;flotando&amp;rdquo; gradualmente hacia el final del arreglo, como burbujas en el agua.&lt;/p&gt;
&lt;h3 id="el-proceso-paso-a-paso"&gt;El proceso paso a paso:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Apuntas a los dos primeros elementos consecutivos del arreglo.&lt;/li&gt;
&lt;li&gt;Si el de la izquierda es mayor que el de la derecha, los &lt;strong&gt;intercambias (swap)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Mueves los punteros una celda a la derecha y repites la comparación.&lt;/li&gt;
&lt;li&gt;Repites el proceso hasta llegar al final del arreglo. Al terminar esta primera pasada, el número más alto está garantizado a estar en la última celda.&lt;/li&gt;
&lt;li&gt;Regresas al inicio y realizas otra pasada completa.&lt;/li&gt;
&lt;li&gt;El proceso termina cuando completas una pasada entera &lt;strong&gt;sin realizar ningún intercambio&lt;/strong&gt;, lo que significa que todo está perfectamente ordenado.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Start["[4, 2, 7, 1]"] --&gt; Step1["Comparar 4 y 2 -&gt; ¡Intercambiar!"]
 Step1 --&gt; Step2["[2, 4, 7, 1]"]
 Step2 --&gt; Step3["Comparar 4 y 7 -&gt; No intercambiar"]
 Step3 --&gt; Step4["[2, 4, 7, 1]"]
 Step4 --&gt; Step5["Comparar 7 y 1 -&gt; ¡Intercambiar!"]
 Step5 --&gt; EndPass["[2, 4, 1, 7] -&gt; Primera pasada completada (7 está ordenado)"]
&lt;/pre&gt;

&lt;h3 id="implementación-en-python"&gt;Implementación en Python:&lt;/h3&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;bubble_sort&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;unsorted_until_index&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&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 style="color:#e06c75"&gt;is_sorted&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bool&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;False&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;while&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;not&lt;/span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;unsorted_until_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;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&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 style="color:#7f848e"&gt;# Intercambio rápido en Python:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&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:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&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:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;unsorted_until_index&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 style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="eficiencia-de-bubble-sort"&gt;Eficiencia de Bubble Sort&lt;/h3&gt;
&lt;p&gt;Para ordenar un arreglo de tamaño &lt;strong&gt;N&lt;/strong&gt;, en el peor de los casos realizamos aproximadamente &lt;strong&gt;N²&lt;/strong&gt; comparaciones e intercambios.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complejidad&lt;/strong&gt;: &lt;strong&gt;O(N²)&lt;/strong&gt; o &lt;strong&gt;Tiempo Cuadrático&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Veredicto&lt;/strong&gt;: Altamente ineficiente para grandes conjuntos de datos. A medida que &lt;strong&gt;N&lt;/strong&gt; se duplica, el número de pasos se multiplica por &lt;strong&gt;cuatro&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-ordenamiento-por-selección-selection-sort"&gt;2. Ordenamiento por Selección (Selection Sort)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Selection Sort&lt;/strong&gt; toma un camino diferente: en lugar de ir comparando parejas consecutivas, realiza una pasada completa para &amp;ldquo;seleccionar&amp;rdquo; el elemento más pequeño del arreglo y colocarlo en su posición final.&lt;/p&gt;
&lt;h3 id="el-proceso-paso-a-paso-1"&gt;El proceso paso a paso:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Comienzas en el índice &lt;code&gt;0&lt;/code&gt;. Recorres todo el arreglo buscando el valor más pequeño.&lt;/li&gt;
&lt;li&gt;Al terminar la pasada, intercambias el valor más pequeño con el elemento en el índice &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Te mueves al índice &lt;code&gt;1&lt;/code&gt; y repites el proceso buscando el menor valor del resto del arreglo.&lt;/li&gt;
&lt;li&gt;Repites esto aumentando el índice de inicio en &lt;code&gt;1&lt;/code&gt; cada vez, hasta llegar al final.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Start["[4, 2, 7, 1]"] --&gt; Step1["Buscar el menor desde índice 0 -&gt; Es 1"]
 Step1 --&gt; Swap1["Intercambiar 1 (menor) con 4 (índice 0)"]
 Swap1 --&gt; Step2["[1, 2, 7, 4]"]
 Step2 --&gt; Step3["Buscar el menor desde índice 1 -&gt; Es 2"]
 Step3 --&gt; Swap2["2 ya está en su lugar -&gt; No hay cambios"]
 Swap2 --&gt; Step4["[1, 2, 7, 4]"]
 Step4 --&gt; Step5["Buscar el menor desde índice 2 -&gt; Es 4"]
 Step5 --&gt; Swap3["Intercambiar 4 con 7 (índice 2)"]
 Swap3 --&gt; End["[1, 2, 4, 7] -&gt; ¡Completamente Ordenado! 🎉"]
&lt;/pre&gt;

&lt;h3 id="implementación-en-python-1"&gt;Implementación en Python:&lt;/h3&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;selection_sort&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&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 style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;j&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;i&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:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;j&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;j&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;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;!=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&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;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="eficiencia-de-selection-sort"&gt;Eficiencia de Selection Sort&lt;/h3&gt;
&lt;p&gt;Si contamos los pasos de Selection Sort, en promedio realiza unas N²/2 comparaciones. Sin embargo, dado que &lt;strong&gt;Big O elimina las constantes&lt;/strong&gt; (las fracciones y multiplicaciones por números fijos), su complejidad teórica también queda como &lt;strong&gt;O(N²)&lt;/strong&gt;.&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;&lt;strong&gt;¿Selection Sort o Bubble Sort?&lt;/strong&gt; Aunque ambos son categorizados bajo el mismo grupo O(N²), Selection Sort es aproximadamente &lt;strong&gt;el doble de rápido&lt;/strong&gt; en la vida real porque realiza un máximo de N intercambios, mientras que Bubble Sort puede realizar hasta N² intercambios.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="3-optimizando-para-escenarios-optimistas-insertion-sort"&gt;3. Optimizando para Escenarios Optimistas (Insertion Sort)&lt;/h2&gt;
&lt;p&gt;Hasta ahora hemos analizado el rendimiento basándonos en el &lt;strong&gt;peor caso posible&lt;/strong&gt;. Pero en el desarrollo real, muchas veces nos encontramos con arreglos que ya están parcialmente ordenados. Aquí es donde brilla &lt;strong&gt;Insertion Sort&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Insertion Sort&lt;/strong&gt; funciona de manera similar a como ordenarías un mazo de cartas en tu mano.&lt;/p&gt;
&lt;h3 id="el-proceso-paso-a-paso-2"&gt;El proceso paso a paso:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Comienzas en el índice &lt;code&gt;1&lt;/code&gt; (la segunda celda). Remueves temporalmente el valor y lo guardas en una variable temporal (&lt;code&gt;temp&lt;/code&gt;), dejando un &amp;ldquo;hueco&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Comparas cada elemento a la izquierda del hueco con el valor en &lt;code&gt;temp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si el elemento de la izquierda es mayor que &lt;code&gt;temp&lt;/code&gt;, lo desplazas una posición hacia la derecha (el hueco se mueve hacia la izquierda).&lt;/li&gt;
&lt;li&gt;Repites el paso 3 hasta encontrar un elemento menor o igual a &lt;code&gt;temp&lt;/code&gt;, o llegar al inicio del arreglo.&lt;/li&gt;
&lt;li&gt;Colocas el valor de &lt;code&gt;temp&lt;/code&gt; en el hueco actual.&lt;/li&gt;
&lt;li&gt;Repites el ciclo avanzando al siguiente índice.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementación-en-python-2"&gt;Implementación en Python:&lt;/h3&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;insertion_sort&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;temp_value&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&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:#e06c75"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;index&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 style="color:#c678dd"&gt;while&lt;/span&gt; &lt;span style="color:#e06c75"&gt;position&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;=&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 style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;temp_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;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&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:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;position&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 style="color:#c678dd"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;break&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;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&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:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;temp_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;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="la-gran-revelación-el-impacto-de-los-escenarios"&gt;La gran revelación: El impacto de los escenarios&lt;/h2&gt;
&lt;p&gt;Analicemos la eficiencia de los tres algoritmos comparando sus mejores, peores y promedio casos:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Algoritmo&lt;/th&gt;
 &lt;th&gt;Peor Caso (Worst Case)&lt;/th&gt;
 &lt;th&gt;Caso Promedio (Average)&lt;/th&gt;
 &lt;th&gt;Mejor Caso (Best Case)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Bubble Sort&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N) (si ya está ordenado)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Selection Sort&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Insertion Sort&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(N)&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="por-qué-insertion-sort-es-tan-especial"&gt;¿Por qué Insertion Sort es tan especial?&lt;/h3&gt;
&lt;p&gt;Si le pasamos un arreglo que &lt;strong&gt;ya está ordenado&lt;/strong&gt; a Insertion Sort, el bucle &lt;code&gt;while&lt;/code&gt; interno se rompe inmediatamente en el primer paso (&lt;code&gt;break&lt;/code&gt;). No hace ningún desplazamiento de datos. Por lo tanto, se ejecuta en un espectacular &lt;strong&gt;tiempo lineal O(N)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si tus datos están mayoritariamente ordenados, &lt;strong&gt;Insertion Sort es por mucho la mejor opción&lt;/strong&gt; entre los ordenamientos básicos.&lt;/p&gt;</content:encoded></item><item><title>Sistemas Agénticos: El Espectro de Autonomía y Desarrollo Responsable</title><link>https://blog.dacadev.com/generative-ai/agents/sistemas-agenticos-autonomia/</link><pubDate>Mon, 18 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/agents/sistemas-agenticos-autonomia/</guid><dc:creator>Dacadev</dc:creator><category>inteligencia artificial generativa</category><description>Aprende qué es un sistema agéntico, explora el espectro de autonomía desde prompting hasta agentes autónomos, y descubre cómo evaluarlos y desarrollarlos con seguridad.</description><media:content url="https://blog.dacadev.com/images/generative-ai/agents/02-sistemas-agenticos/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é-es-un-sistema-agéntico"&gt;¿Qué es un Sistema Agéntico?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-espectro-de-autonomía"&gt;El Espectro de Autonomía&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#nivel-1-prompting-estándar-baja-autonomía"&gt;Nivel 1: Prompting Estándar (Baja Autonomía)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nivel-2-pasos-fijos-autonomía-orquestada--rag"&gt;Nivel 2: Pasos Fijos (Autonomía Orquestada / RAG)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#nivel-3-agente-autónomo-alta-autonomía"&gt;Nivel 3: Agente Autónomo (Alta Autonomía)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#casos-de-uso-del-mundo-real"&gt;Casos de Uso del Mundo Real&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#desarrollo-y-uso-responsable-de-agentes-ia"&gt;Desarrollo y Uso Responsable de Agentes IA&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-humano-en-el-bucle-human-in-the-loop"&gt;1. Humano en el Bucle (Human-in-the-Loop)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-guardrails-límites-y-barreras-técnicas"&gt;2. Guardrails (Límites y Barreras Técnicas)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-mitigación-de-desinformación-y-sesgos"&gt;3. Mitigación de Desinformación y Sesgos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#evaluando-sistemas-agénticos-un-desafío-complejo"&gt;Evaluando Sistemas Agénticos: Un Desafío Complejo&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;Cuando empezamos a programar con &lt;strong&gt;LLMs&lt;/strong&gt; (Large Language Models), a menudo nos quedamos en la fase de &amp;ldquo;pregunta-respuesta&amp;rdquo;. Le envías un prompt al modelo y este te devuelve una respuesta inmediata. Pero el verdadero poder de la &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt; (IA) surge cuando le damos libertad al modelo para actuar por sí mismo, tomar decisiones y corregir su camino.&lt;/p&gt;
&lt;p&gt;Aquí es donde entramos al tema de los &lt;strong&gt;Sistemas Agénticos&lt;/strong&gt;. Te has preguntado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;¿cuánta libertad debería tener realmente una IA?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Cómo nos aseguramos de que no tome acciones destructivas?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Cómo medimos si está haciendo bien su trabajo?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&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;En este artículo aprenderás qué define a un sistema agéntico, exploraremos el espectro de autonomía desde un simple prompt hasta agentes 100% autónomos, y analizaremos las mejores prácticas de desarrollo responsable y evaluación de sistemas agénticos. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="qué-es-un-sistema-agéntico"&gt;¿Qué es un Sistema Agéntico?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Un sistema se considera &lt;strong&gt;agéntico&lt;/strong&gt; en la medida en que el LLM tiene el control para tomar decisiones, elegir herramientas y definir los pasos a seguir para alcanzar un objetivo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A diferencia de un software tradicional basado puramente en reglas rígidas y flujos de control fijos (&lt;code&gt;if/else&lt;/code&gt;), un sistema agéntico exhibe un &lt;strong&gt;comportamiento orientado a metas&lt;/strong&gt; (goal-directed behavior). Nosotros le decimos el &lt;em&gt;qué&lt;/em&gt; (el objetivo final) y el agente decide el &lt;em&gt;cómo&lt;/em&gt; (el plan de ejecución).&lt;/p&gt;
&lt;p&gt;No obstante, la autonomía no es un interruptor binario de &amp;ldquo;todo o nada&amp;rdquo;. Existe un amplio espectro de control que podemos otorgar a nuestros agentes, dependiendo de la criticidad de la tarea y de los límites que queramos establecer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-espectro-de-autonomía"&gt;El Espectro de Autonomía&lt;/h2&gt;
&lt;p&gt;Dependiendo del diseño del sistema, un agente de IA puede tener diferentes grados de libertad. En la práctica, podemos clasificar la autonomía en tres grandes niveles:&lt;/p&gt;
&lt;h3 id="nivel-1-prompting-estándar-baja-autonomía"&gt;Nivel 1: Prompting Estándar (Baja Autonomía)&lt;/h3&gt;
&lt;p&gt;Es el nivel básico. El usuario envía un prompt, el LLM procesa la solicitud utilizando únicamente su conocimiento interno y genera una respuesta directa. No hay uso de herramientas externas ni toma de decisiones sobre el flujo de ejecución. El control es 100% del usuario.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 P[User Prompt] --&gt; LLM[🧠 LLM Tradicional] --&gt; Ans1[Respuesta Directa]
&lt;/pre&gt;

&lt;h3 id="nivel-2-pasos-fijos-autonomía-orquestada--rag"&gt;Nivel 2: Pasos Fijos (Autonomía Orquestada / RAG)&lt;/h3&gt;
&lt;p&gt;En este nivel, el agente está integrado dentro de un flujo de trabajo predefinido (orquestado). Por ejemplo, un sistema &lt;strong&gt;RAG&lt;/strong&gt; (Generación Aumentada por Recuperación) primero ejecuta una búsqueda vectorial en una base de datos de manera obligatoria (Paso 1) y luego le pasa ese contexto al LLM para que redacte la respuesta final (Paso 2). El modelo tiene cierta autonomía para elegir herramientas locales o resumir la información, pero no puede alterar el flujo global de los pasos.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 P2[User Prompt] --&gt; S1[🔍 Paso 1: Búsqueda Vectorial]
 S1 --&gt; S2[🧠 Paso 2: Razonamiento y Herramientas]
 S2 --&gt; Ans2[Respuesta Final]
&lt;/pre&gt;

&lt;h3 id="nivel-3-agente-autónomo-alta-autonomía"&gt;Nivel 3: Agente Autónomo (Alta Autonomía)&lt;/h3&gt;
&lt;p&gt;Aquí el agente tiene total libertad dentro de un bucle de ejecución interactivo. El LLM recibe una meta, genera un plan inicial, ejecuta una acción (como llamar a una API o ejecutar código), observa el resultado del entorno, actualiza su plan y decide de forma autónoma si ha logrado cumplir el objetivo o si necesita seguir iterando.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 P3[User Prompt] --&gt; RLLM[🧠 LLM - Memoria y Herramientas]
 RLLM --&gt; Plan[📋 Generar Plan]
 Plan --&gt; Action[⚙️ Ejecutar Acción]
 Action --&gt; Observe[👁️ Observar Resultado]
 Observe --&gt; Decision{¿Meta cumplida?}
 Decision --&gt;|No: Re-planificar| Update[🔄 Actualizar Plan]
 Update --&gt; RLLM
 Decision --&gt;|Sí| Ans3[Respuesta Final]
&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id="casos-de-uso-del-mundo-real"&gt;Casos de Uso del Mundo Real&lt;/h2&gt;
&lt;p&gt;Los sistemas agénticos ya están transformando múltiples industrias. Algunos de los ejemplos más destacados son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Coding Agents (Agentes de Programación)&lt;/strong&gt;: Herramientas que no solo sugieren código, sino que pueden leer repositorios enteros, escribir pruebas unitarias, ejecutar programas en entornos de prueba seguros (sandboxes) y depurar errores por sí mismos hasta que el código funcione.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Búsqueda Profunda (DeepSearch)&lt;/strong&gt;: Agentes de investigación que realizan búsquedas web iterativas, cruzando múltiples fuentes de información, validando datos contradictorios y redactando reportes completos de manera autónoma.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatización de Procesos de Negocio&lt;/strong&gt;: Agentes capaces de interactuar con software de facturación, responder correos electrónicos de clientes resolviendo problemas complejos y actualizar bases de datos sin intervención humana constante.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="desarrollo-y-uso-responsable-de-agentes-ia"&gt;Desarrollo y Uso Responsable de Agentes IA&lt;/h2&gt;
&lt;p&gt;Darle autonomía a un agente digital conlleva grandes riesgos. Si le permites a un agente ejecutar comandos en tu terminal o enviar correos a tus clientes, un pequeño error de razonamiento o una alucinación podría causar pérdidas de información o daños reputacionales.&lt;/p&gt;
&lt;p&gt;Por ello, el desarrollo ético y seguro de agentes requiere la implementación de tres pilares fundamentales:&lt;/p&gt;
&lt;h3 id="1-humano-en-el-bucle-human-in-the-loop"&gt;1. Humano en el Bucle (Human-in-the-Loop)&lt;/h3&gt;
&lt;p&gt;Consiste en diseñar puntos de control donde el agente deba detener su ejecución y solicitar la aprobación explícita de un ser humano antes de realizar acciones críticas o irreversibles.&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;&lt;strong&gt;Regla de oro:&lt;/strong&gt; Si una acción del agente tiene efectos directos en el mundo físico o digital real (ej. realizar un pago, enviar un email a un cliente, o borrar un archivo), &lt;strong&gt;siempre&lt;/strong&gt; debes implementar una aprobación humana previa. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="2-guardrails-límites-y-barreras-técnicas"&gt;2. Guardrails (Límites y Barreras Técnicas)&lt;/h3&gt;
&lt;p&gt;Los guardrails son capas de software que rodean al agente y restringen lo que puede y no puede hacer. Algunas estrategias eficaces incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Validación Estricta de Entradas y Salidas&lt;/strong&gt;: Analizar y limpiar los prompts enviados al LLM y las llamadas a herramientas generadas por este.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presupuesto de Tokens y Pasos&lt;/strong&gt;: Limitar el número de iteraciones máximas del bucle autónomo para evitar bucles infinitos muy costosos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entornos Seguros (Sandboxing)&lt;/strong&gt;: Ejecutar cualquier herramienta de código o comando del sistema dentro de contenedores aislados (como Docker) para proteger la máquina anfitriona.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-mitigación-de-desinformación-y-sesgos"&gt;3. Mitigación de Desinformación y Sesgos&lt;/h3&gt;
&lt;p&gt;Los agentes pueden propagar información falsa rápidamente si no se controlan sus fuentes de datos. Es vital dotar al agente de capacidades de contraste y verificación de datos cuando trabaja en entornos abiertos como internet, además de que de por si un LLM puede alucinar, dando respuestas que suenan plausibles pero son completamente inventadas.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="evaluando-sistemas-agénticos-un-desafío-complejo"&gt;Evaluando Sistemas Agénticos: Un Desafío Complejo&lt;/h2&gt;
&lt;p&gt;Si evaluar un LLM tradicional (que solo produce texto) ya es difícil, evaluar un agente es considerablemente más complejo. Un agente interactúa con su entorno, ejecuta múltiples pasos lógicos y toma decisiones secuenciales donde cada acción influye en el siguiente estado del sistema.&lt;/p&gt;
&lt;p&gt;Al evaluar sistemas agénticos, no podemos limitarnos a verificar si el texto final &amp;ldquo;se lee bien&amp;rdquo;. Debemos evaluar el &lt;strong&gt;sistema completo&lt;/strong&gt; bajo múltiples dimensiones:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Dimensión de Evaluación&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Qué mide&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Cómo se evalúa&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Tasa de Éxito de la Tarea&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Si el agente logró resolver la meta propuesta correctamente.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Pruebas de integración automatizadas con metas claras y verificables.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Eficiencia de la Trayectoria&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;El número de pasos y tokens utilizados. Un agente que resuelve el problema en 3 pasos es mejor que uno que toma 20.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Análisis de logs de ejecución y costos asociados.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Alineación y Cumplimiento&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Si el agente respetó las políticas de seguridad y las barreras técnicas durante su ejecución.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Inyección de prompts maliciosos de prueba (Red Teaming).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Resiliencia ante Errores&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Cómo reacciona el agente cuando una herramienta falla o una API devuelve un código de error.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Simulación de caídas de servicios y análisis de la capacidad de replanificación del agente.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La evaluación constante es la única forma de garantizar que el agente sea seguro, confiable y verdaderamente útil antes de desplegarlo en un entorno de producción crítico.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;La autonomía de los agentes de IA abre un mundo lleno de posibilidades, pero también exige un alto nivel de responsabilidad de nuestra parte como desarrolladores. Al comprender el &lt;strong&gt;espectro de autonomía&lt;/strong&gt;, diseñar e implementar &lt;strong&gt;guardrails&lt;/strong&gt; técnicos sólidos e implementar metodologías de &lt;strong&gt;evaluación robustas&lt;/strong&gt;, podemos construir herramientas agénticas que asombren a nuestros usuarios a la vez que se mantienen totalmente seguras.&lt;/p&gt;
&lt;p&gt;En la próxima entrega de esta serie, exploraremos cómo podemos escalar estos sistemas haciendo que múltiples agentes con especialidades únicas colaboren entre sí. ¡Nos vemos en el próximo artículo!&lt;/p&gt;</content:encoded></item><item><title>Estructuras de Datos y Algoritmos: Los Fundamentos que Todo Dev Debe Saber</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/01-estructuras-de-datos-y-algoritmos-fundamentos/</link><pubDate>Sun, 17 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/01-estructuras-de-datos-y-algoritmos-fundamentos/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Descubre por qué importan las estructuras de datos y cómo medir su eficiencia en pasos en lugar de segundos. Guía completa de Arrays, Sets y Búsqueda Binaria.</description><media:content url="https://blog.dacadev.com/images/programming/structures-algorithms/01-structures-algorithms-fundamentals/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="#por-qué-importa-la-estructura"&gt;¿Por qué importa la estructura?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#qué-es-una-estructura-de-datos"&gt;¿Qué es una Estructura de Datos?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#midiendo-la-velocidad-del-código"&gt;Midiendo la velocidad del código&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-array"&gt;El Array&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#las-4-operaciones-fundamentales-en-un-array"&gt;Las 4 Operaciones Fundamentales en un Array&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-lectura-read--get"&gt;1. Lectura (Read / Get)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-búsqueda-search"&gt;2. Búsqueda (Search)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-inserción-insert"&gt;3. Inserción (Insert)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#4-eliminación-delete"&gt;4. Eliminación (Delete)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#sets-cómo-una-sola-regla-cambia-toda-la-eficiencia"&gt;Sets: Cómo una sola regla cambia toda la eficiencia&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#arreglos-ordenados"&gt;Arreglos Ordenados&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#inserción-en-arreglos-ordenados"&gt;Inserción en Arreglos Ordenados&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#búsqueda-binaria"&gt;Búsqueda Binaria&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#búsqueda-binaria-vs-búsqueda-lineal"&gt;Búsqueda Binaria vs. Búsqueda Lineal&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Si estás dando tus primeros pasos en el desarrollo de software, es muy común que midas el éxito de tu código con una única pregunta: &lt;strong&gt;¿funciona y hace lo que se supone que debe hacer?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sin embargo, a medida que avanzas en tu carrera, te das cuenta de que existe un mundo entero de otras métricas críticas, como por ejemplo: &lt;em&gt;¿Qué tan rápido se ejecuta?&lt;/em&gt; &lt;em&gt;¿Cuánta memoria consume?&lt;/em&gt; &lt;em&gt;¿Es escalable si el volumen de datos crece por mil?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Para escribir código que no solo funcione sino que sea verdaderamente profesional, debes dominar dos pilares fundamentales: las &lt;strong&gt;estructuras de datos&lt;/strong&gt; y los &lt;strong&gt;algoritmos&lt;/strong&gt;. Empecemos por lo básico: ¿qué son y por qué importan?&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="por-qué-importa-la-estructura"&gt;¿Por qué importa la estructura?&lt;/h2&gt;
&lt;p&gt;Consideremos una tarea sencilla: escribir una función en Python que imprima todos los números pares del 2 al 100.&lt;/p&gt;
&lt;p&gt;Aquí tienes la &lt;strong&gt;versión uno&lt;/strong&gt; (menos eficiente):&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;print_numbers_version_one&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&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;while&lt;/span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Si el número es par, lo imprimimos:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;number&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;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;number&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;number&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y aquí tienes la &lt;strong&gt;versión dos&lt;/strong&gt; (más eficiente):&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;print_numbers_version_two&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&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;while&lt;/span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;number&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:#7f848e"&gt;# Incrementamos por 2 directo al siguiente número par:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ambos programas producen exactamente el mismo resultado. Pero la versión uno realiza &lt;strong&gt;100 iteraciones&lt;/strong&gt; y comprueba la paridad en cada paso. La versión dos solo hace &lt;strong&gt;50 iteraciones&lt;/strong&gt; y no realiza comprobaciones matemáticas innecesarias. Es el doble de eficiente.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-una-estructura-de-datos"&gt;¿Qué es una Estructura de Datos?&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;estructura de datos&lt;/strong&gt; es la manera física y lógica en la que &lt;strong&gt;organizamos&lt;/strong&gt;, &lt;strong&gt;gestionamos&lt;/strong&gt; y &lt;strong&gt;almacenamos&lt;/strong&gt; los datos en nuestro código. La forma en que eliges organizar tus datos afecta directamente la rapidez con la que tu programa puede operar con ellos.&lt;/p&gt;
&lt;p&gt;Para un mismo propósito, puedes usar diferentes estructuras. Por ejemplo, si deseas unir tres palabras:&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Usando variables simples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;x&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;¡Hola! &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;y&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;¿Cómo estás &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;z&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;hoy?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;z&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:#7f848e"&gt;# Usando un Array (o Lista en Python)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;array&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#34;¡Hola! &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;¿Cómo estás &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;hoy?&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;array&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;array&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;array&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="midiendo-la-velocidad-del-código"&gt;Midiendo la velocidad del código&lt;/h2&gt;
&lt;p&gt;Un error clásico es medir la velocidad de un programa cronometrando los segundos que tarda en completarse. &lt;strong&gt;No es la mejor manera&lt;/strong&gt;, El tiempo de ejecución en segundos varía según:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El procesador y hardware de la máquina.&lt;/li&gt;
&lt;li&gt;Qué otros programas se están ejecutando en segundo plano.&lt;/li&gt;
&lt;li&gt;El lenguaje de programación y su compilador o intérprete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para medir la velocidad de manera científica y objetiva, contamos &lt;strong&gt;la cantidad de pasos físicos&lt;/strong&gt; que requiere un algoritmo para completarse.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-array"&gt;El Array&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;Array&lt;/strong&gt; (o arreglo) es la estructura de datos más básica y el punto de partida de casi todo en computación. Físicamente, un array es un bloque &lt;strong&gt;continuo&lt;/strong&gt; de memoria.&lt;/p&gt;
&lt;p&gt;Un array tiene dos características clave:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tamaño (Size)&lt;/strong&gt;: El número total de elementos que contiene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Índice (Index)&lt;/strong&gt;: La posición numérica de cada celda. En la gran mayoría de lenguajes de programación, empezamos a contar desde &lt;strong&gt;0&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;array&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#34;manzanas&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;bananas&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;pepinos&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;dátiles&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;arándanos&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos representar la memoria de un array así:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 a0["[0] manzanas&lt;br/&gt;Mem: 1000"]
 a1["[1] bananas&lt;br/&gt;Mem: 1001"]
 a2["[2] pepinos&lt;br/&gt;Mem: 1002"]
 a3["[3] dátiles&lt;br/&gt;Mem: 1003"]
 a4["[4] arándanos&lt;br/&gt;Mem: 1004"]
 a0 --- a1 --- a2 --- a3 --- a4
&lt;/pre&gt;

&lt;h3 id="las-4-operaciones-fundamentales-en-un-array"&gt;Las 4 Operaciones Fundamentales en un Array&lt;/h3&gt;
&lt;p&gt;Para evaluar qué tan eficiente es una estructura de datos, analizamos cuántos pasos le toma realizar las cuatro operaciones básicas:&lt;/p&gt;
&lt;h4 id="1-lectura-read--get"&gt;1. Lectura (Read / Get)&lt;/h4&gt;
&lt;p&gt;Consiste en obtener el valor que está en un índice específico (por ejemplo, &amp;ldquo;¿qué hay en la posición 3?&amp;rdquo;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;¿Cómo lo hace la computadora?&lt;/strong&gt; Al estar guardados en memoria de manera continua, la computadora hace un cálculo matemático simple: &lt;code&gt;DirecciónInicio + (Índice * TamañoCelda)&lt;/code&gt;. Va directo a la celda en &lt;strong&gt;1 paso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;: 1 paso (constante).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-búsqueda-search"&gt;2. Búsqueda (Search)&lt;/h4&gt;
&lt;p&gt;Consiste en encontrar el índice de un elemento sabiendo únicamente su valor (por ejemplo, &amp;ldquo;¿en qué posición están los &amp;lsquo;pepinos&amp;rsquo;?&amp;rdquo;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;¿Cómo lo hace?&lt;/strong&gt; La computadora no puede ver el contenido de todo el array a la vez. Debe ir celda por celda, de izquierda a derecha, comprobando si el valor coincide. A esto se le llama &lt;strong&gt;Búsqueda Lineal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;: Si el elemento está al principio, toma 1 paso. Si está al final o no existe, toma &lt;strong&gt;N pasos&lt;/strong&gt; (siendo N el tamaño del array). En el peor de los casos, la eficiencia es de &lt;strong&gt;N pasos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-inserción-insert"&gt;3. Inserción (Insert)&lt;/h4&gt;
&lt;p&gt;Consiste en agregar un nuevo elemento al array. Aquí tenemos dos escenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Insertar al final&lt;/strong&gt;: Es súper sencillo. La computadora simplemente coloca el valor en la siguiente celda libre. Toma &lt;strong&gt;1 paso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insertar al inicio o en medio&lt;/strong&gt;: ¡Aquí viene el dolor de cabeza! Para meter un valor al inicio (índice 0), primero debemos mover &lt;strong&gt;todos&lt;/strong&gt; los elementos existentes una celda hacia la derecha para abrir espacio.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Antes de Insertar
 A0["[0] A"] --&gt; A1["[1] B"] --&gt; A2["[2] C"]
 end
 subgraph Proceso de Desplazamiento
 D0["Desplazar C a [3]"] --&gt; D1["Desplazar B a [2]"] --&gt; D2["Desplazar A a [1]"]
 end
 subgraph Resultado Final
 R0["[0] NUEVO"] --&gt; R1["[1] A"] --&gt; R2["[2] B"] --&gt; R3["[3] C"]
 end
&lt;/pre&gt;

&lt;p&gt;Si el array tiene tamaño N, insertar al principio toma &lt;strong&gt;N desplazamientos + 1 inserción = N + 1 pasos&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="4-eliminación-delete"&gt;4. Eliminación (Delete)&lt;/h4&gt;
&lt;p&gt;Consiste en borrar un elemento de un índice específico. Al igual que con la inserción, si borramos el elemento del inicio, dejamos un &amp;ldquo;hueco vacío&amp;rdquo;. Las reglas de los arrays exigen que no haya espacios vacíos intermedios, por lo que debemos desplazar &lt;strong&gt;todos&lt;/strong&gt; los elementos de la derecha una posición hacia la izquierda.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;: En el peor de los casos (eliminar el primer elemento), toma &lt;strong&gt;N - 1 pasos&lt;/strong&gt; de desplazamiento.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="sets-cómo-una-sola-regla-cambia-toda-la-eficiencia"&gt;Sets: Cómo una sola regla cambia toda la eficiencia&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;Set&lt;/strong&gt; (conjunto) es un tipo especial de arreglo con una regla estricta: &lt;strong&gt;no se permiten valores duplicados&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Esta pequeña regla de negocio transforma drásticamente la eficiencia de la operación de &lt;strong&gt;inserción&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En un Array común, insertar al final toma &lt;strong&gt;1 paso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;En un Set, antes de insertar un elemento al final, la computadora debe hacer una &lt;strong&gt;búsqueda lineal completa&lt;/strong&gt; para asegurar que el elemento no exista previamente en el Set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por lo tanto, la inserción al final en un Set toma &lt;strong&gt;N pasos de búsqueda + 1 paso de inserción = N + 1 pasos&lt;/strong&gt;.&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;Aunque los Sets protegen la integridad de tus datos previniendo duplicados, debes tener en cuenta que su inserción es mucho más lenta en arreglos de gran tamaño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="arreglos-ordenados"&gt;Arreglos Ordenados&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;Arreglo Ordenado&lt;/strong&gt; es un array cuyos valores se mantienen de forma ascendente o descendente de forma obligatoria.&lt;/p&gt;
&lt;h3 id="inserción-en-arreglos-ordenados"&gt;Inserción en Arreglos Ordenados&lt;/h3&gt;
&lt;p&gt;Para insertar un valor en un arreglo ordenado (por ejemplo, meter el número &lt;code&gt;4&lt;/code&gt; en &lt;code&gt;[1, 3, 5, 8]&lt;/code&gt;), no podemos simplemente agregarlo al final. Debemos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buscar el lugar exacto donde corresponde el elemento para mantener el orden (después del &lt;code&gt;3&lt;/code&gt; y antes del &lt;code&gt;5&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Desplazar los elementos mayores hacia la derecha (&lt;code&gt;5&lt;/code&gt; y &lt;code&gt;8&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Insertar el nuevo valor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esto hace que la inserción sea ligeramente más costosa en pasos que en un array normal, pero abre la puerta a un algoritmo de búsqueda revolucionario.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="búsqueda-binaria"&gt;Búsqueda Binaria&lt;/h2&gt;
&lt;p&gt;Si tu arreglo &lt;strong&gt;no está ordenado&lt;/strong&gt;, la única forma de buscar es la búsqueda lineal (celda por celda), lo que toma hasta &lt;strong&gt;N&lt;/strong&gt; pasos.&lt;/p&gt;
&lt;p&gt;Pero si tu arreglo &lt;strong&gt;sí está ordenado&lt;/strong&gt;, puedes usar la &lt;strong&gt;Búsqueda Binaria&lt;/strong&gt;. Este algoritmo consiste en:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ir directo al elemento del medio del arreglo.&lt;/li&gt;
&lt;li&gt;Si el valor buscado es menor, descartas toda la mitad derecha.&lt;/li&gt;
&lt;li&gt;Si es mayor, descartas toda la mitad izquierda.&lt;/li&gt;
&lt;li&gt;Repites el proceso en la mitad restante hasta encontrarlo o quedarte sin elementos.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Start["Buscar 11 en [2, 4, 6, 8, 11, 14, 18, 22]"] --&gt; Step1["Valor central: 8 (índice 3)"]
 Step1 --&gt; Check{"¿Es 11 == 8?"}
 Check -- No, es mayor --&gt; DescartarIzq["Descartar [2, 4, 6, 8]"]
 DescartarIzq --&gt; SubSearch["Buscar en [11, 14, 18, 22]"]
 SubSearch --&gt; Step2["Valor central: 14 (índice 5)"]
 Step2 --&gt; Check2{"¿Es 11 == 14?"}
 Check2 -- No, es menor --&gt; DescartarDer["Descartar [14, 18, 22]"]
 DescartarDer --&gt; Final["Buscar en [11] -&gt; ¡Encontrado! 🎉"]
&lt;/pre&gt;

&lt;h3 id="búsqueda-binaria-vs-búsqueda-lineal"&gt;Búsqueda Binaria vs. Búsqueda Lineal&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tamaño del Arreglo (N)&lt;/th&gt;
 &lt;th&gt;Pasos Máximos (Lineal)&lt;/th&gt;
 &lt;th&gt;Pasos Máximos (Binaria)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10,000&lt;/td&gt;
 &lt;td&gt;10,000&lt;/td&gt;
 &lt;td&gt;14&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;1,000,000&lt;/td&gt;
 &lt;td&gt;1,000,000&lt;/td&gt;
 &lt;td&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La diferencia es notable. Buscar en una base de datos de un millón de registros toma &lt;strong&gt;un millón de pasos&lt;/strong&gt; con búsqueda lineal, pero solo &lt;strong&gt;20 pasos&lt;/strong&gt; usando búsqueda binaria. Por eso, elegir el algoritmo correcto de acuerdo a la estructura de tus datos marca toda la diferencia del mundo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;En el siguiente &lt;a href="https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/02-big-o-notation-y-algoritmos-de-ordenamiento"



 


&gt;&lt;strong&gt;post&lt;/strong&gt;&lt;/a&gt;, aprenderemos la forma matemática formal en la que los desarrolladores expresamos estas diferencias de eficiencia: la &lt;strong&gt;Notación Big O&lt;/strong&gt;, y cómo usarla para analizar nuestros primeros algoritmos de ordenamiento. ¡No te lo pierdas! 🚀&lt;/p&gt;</content:encoded></item><item><title>Agentes IA: ¿Qué es un Agente de Inteligencia Artificial?</title><link>https://blog.dacadev.com/generative-ai/agents/que-es-un-agente-ia/</link><pubDate>Fri, 15 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/generative-ai/agents/que-es-un-agente-ia/</guid><dc:creator>Dacadev</dc:creator><category>inteligencia artificial generativa</category><description>Descubre qué es un agente de inteligencia artificial, cómo funciona un LLM como cerebro del agente, y los módulos clave: memoria, herramientas y planificación.</description><media:content url="https://blog.dacadev.com/images/generative-ai/agents/01-que-es-un-agente/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="#definición-formal-de-un-agente"&gt;Definición formal de un Agente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-agente-basado-en-llm"&gt;El Agente basado en LLM&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#large-language-models-llms"&gt;Large Language Models (LLMs)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#tokenización"&gt;Tokenización&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#autoregresión"&gt;Autoregresión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#llms-con-razonamiento"&gt;LLMs con Razonamiento&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#ejemplo-de-razonamiento"&gt;Ejemplo de razonamiento&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#aumentando-las-capacidades-del-llm"&gt;Aumentando las capacidades del LLM&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#memoria"&gt;Memoria&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#herramientas-tools"&gt;Herramientas (Tools)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#planificación-y-reflexión"&gt;Planificación y Reflexión&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#descomposición-de-tareas"&gt;Descomposición de tareas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejecución-iterativa-con-razonamiento"&gt;Ejecución iterativa con razonamiento&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#reflexión"&gt;Reflexión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&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 el mundo de la Inteligencia Artificial, los términos aparecen y se mezclan con una velocidad que a veces marea. Uno de los conceptos más poderosos —y más incomprendidos— es el de &lt;strong&gt;Agente de IA&lt;/strong&gt;. Seguro has escuchado el término, pero ¿qué significa realmente? ¿Qué hace que un sistema deje de ser un simple chatbot y se convierta en un agente capaz de percibir, razonar y actuar sobre su entorno?&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;En este artículo aprenderás qué es un agente de IA desde su definición formal, cómo un LLM actúa como su &amp;ldquo;cerebro&amp;rdquo;, y los módulos fundamentales que lo potencian: memoria, herramientas y planificación. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="definición-formal-de-un-agente"&gt;Definición formal de un Agente&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;An agent is anything that can be viewed as perceiving its environment through sensors and acting upon that environment through actuators.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Russell &amp;amp; Norvig, AI: A Modern Approach&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Podemos descomponer esta definición en los componentes fundamentales que están en el corazón de todo agente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Environment (Entorno)&lt;/strong&gt;: El mundo con el que el agente interactúa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensors (Sensores)&lt;/strong&gt;: Componentes que el agente usa para observar su entorno&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actuators (Actuadores)&lt;/strong&gt;: Herramientas que el agente usa para actuar sobre el entorno&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effector (Efector)&lt;/strong&gt;: El &amp;ldquo;cerebro&amp;rdquo; o las reglas que deciden cómo pasar de observaciones a acciones&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 E[🌍 Entorno] --&gt;|percibe| S[📡 Sensores]
 S --&gt;|observaciones| EF[🧠 Efector]
 EF --&gt;|decisiones| A[🔧 Actuadores]
 A --&gt;|actúa sobre| E
&lt;/pre&gt;

&lt;p&gt;Imagina un robot aspiradora: sus sensores detectan obstáculos y suciedad (entorno), su &amp;ldquo;cerebro&amp;rdquo; decide qué dirección tomar (efector), y sus motores y cepillos ejecutan la acción (actuadores). Un agente de IA funciona con la misma lógica, pero en un entorno digital.&lt;/p&gt;
&lt;h2 id="el-agente-basado-en-llm"&gt;El Agente basado en LLM&lt;/h2&gt;
&lt;p&gt;En la práctica, el &lt;strong&gt;Efector&lt;/strong&gt; o cerebro del agente tiende a ser un LLM con capacidad de razonamiento. A través de módulos adicionales —memoria, herramientas y planificación— este LLM es capaz de interactuar con su entorno.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los &lt;strong&gt;Actuadores&lt;/strong&gt; son las herramientas del LLM (APIs, funciones, búsquedas)&lt;/li&gt;
&lt;li&gt;Los &lt;strong&gt;Sensores&lt;/strong&gt; son las capacidades multimodales del LLM (texto, imágenes, audio)&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;Usuario&lt;/strong&gt; forma parte del entorno e influye directamente en cómo se inicia el agente&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 U[👤 Usuario] --&gt;|prompt| LLM[🧠 LLM - Cerebro del Agente]
 LLM --&gt;|usa| T[🔧 Herramientas / Tools]
 LLM --&gt;|consulta| M[💾 Memoria]
 LLM --&gt;|genera| P[📋 Plan]
 T --&gt;|resultados| LLM
 M --&gt;|contexto| LLM
 P --&gt;|siguiente paso| LLM
 LLM --&gt;|respuesta| U
 T --&gt;|modifica| ENV[🌍 Entorno Digital]
 ENV --&gt;|datos| LLM
&lt;/pre&gt;

&lt;p&gt;Sin ninguna interacción del usuario, el LLM no tomará ninguna acción. El agente está fuertemente influenciado por cómo el usuario inicia la conversación.&lt;/p&gt;
&lt;h2 id="large-language-models-llms"&gt;Large Language Models (LLMs)&lt;/h2&gt;
&lt;p&gt;El LLM es considerado el &amp;ldquo;cerebro&amp;rdquo; del agente. Tradicionalmente, un LLM es un modelo que no hace más que &lt;strong&gt;predecir la siguiente palabra&lt;/strong&gt; basándose en un texto de entrada.&lt;/p&gt;
&lt;h3 id="tokenización"&gt;Tokenización&lt;/h3&gt;
&lt;p&gt;El LLM primero descompone la consulta de entrada en &lt;strong&gt;tokens&lt;/strong&gt;, que son sub-componentes de palabras que permiten al modelo generalizar a palabras que no ha visto antes. El modelo procesa estos tokens y hace una predicción sobre cuál podría ser el siguiente.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/agents/01-que-es-un-agente/tokenizacion_hu_ecaeedb330f63e63.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;h3 id="autoregresión"&gt;Autoregresión&lt;/h3&gt;
&lt;p&gt;El LLM predice el siguiente token, usa ese token predicho para actualizar su entrada, y luego continúa las predicciones. Al hacer esto de forma iterativa —lo que se llama &lt;strong&gt;autoregresión&lt;/strong&gt;— puede crear respuestas completas a la consulta del usuario.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant Input as Texto de entrada
 participant LLM as LLM
 participant Output as Texto generado

 Input-&gt;&gt;LLM: "El gato está"
 LLM-&gt;&gt;Output: "sentado"
 Note over Input,Output: Se agrega al input
 Input-&gt;&gt;LLM: "El gato está sentado"
 LLM-&gt;&gt;Output: "en"
 Note over Input,Output: Se agrega al input
 Input-&gt;&gt;LLM: "El gato está sentado en"
 LLM-&gt;&gt;Output: "la silla"
 Note over Output: Respuesta completa generada
&lt;/pre&gt;

&lt;p&gt;Cada predicción se alimenta de las anteriores, construyendo la respuesta palabra por palabra.&lt;/p&gt;
&lt;h2 id="llms-con-razonamiento"&gt;LLMs con Razonamiento&lt;/h2&gt;
&lt;p&gt;El campo de los agentes de IA descubrió que las capacidades de los LLMs aumentarían sustancialmente si pudieran &lt;strong&gt;razonar&lt;/strong&gt;. En lugar de que el modelo &amp;ldquo;piense&amp;rdquo; en silencio (a través de sus parámetros internos), ahora se entrenan para &amp;ldquo;pensar en voz alta&amp;rdquo; generando &lt;strong&gt;trazas de razonamiento&lt;/strong&gt; antes de derivar la respuesta.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 Q[📝 Consulta del usuario] --&gt; T[💭 Pensamientos / Razonamiento]
 T --&gt; R[✅ Respuesta final]
&lt;/pre&gt;

&lt;p&gt;La idea principal es que al escribir sus pensamientos primero mediante su comportamiento autoregresivo, el LLM puede dedicar cómputo adicional a estructurar su razonamiento antes de generar la respuesta. Como los humanos, al estructurar sus pensamientos, las consultas complejas que requieren razonamiento multi-paso son más fáciles de resolver.&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;En la práctica, estos &amp;ldquo;pensamientos&amp;rdquo; están ocultos para el usuario. La respuesta que ves generalmente representa un resumen del razonamiento interno del modelo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="ejemplo-de-razonamiento"&gt;Ejemplo de razonamiento&lt;/h3&gt;
&lt;p&gt;Veamos cómo un LLM con razonamiento aborda un problema complejo:&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/generative-ai/agents/01-que-es-un-agente/reasoning-example_hu_600adf9fb2790942.webp"
 alt="Imagen guia del contenido de la página"/&gt;
 &lt;/div&gt;
 
 
 


&lt;p&gt;El modelo genera una cadena de pensamientos internos, evalúa opciones y finalmente produce una respuesta bien fundamentada.&lt;/p&gt;
&lt;h2 id="aumentando-las-capacidades-del-llm"&gt;Aumentando las capacidades del LLM&lt;/h2&gt;
&lt;p&gt;Aunque los LLMs con razonamiento son vitales para los agentes de IA, siguen siendo incompletos. Como entidades estáticas de texto-a-texto, los LLMs no tienen control sobre su entorno, ni recuerdan sus interacciones, ni aprenden de ellas.&lt;/p&gt;
&lt;p&gt;Para convertir un LLM en un verdadero agente, necesitamos proveerlo de tres módulos fundamentales:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 LLM[🧠 LLM con Razonamiento]
 MEM[💾 Memoria]
 TOOLS[🔧 Herramientas]
 PLAN[📋 Planificación y Reflexión]

 MEM --&gt; LLM
 TOOLS --&gt; LLM
 PLAN --&gt; LLM

 LLM --&gt; AGENT[🤖 Agente de IA]
&lt;/pre&gt;

&lt;h3 id="memoria"&gt;Memoria&lt;/h3&gt;
&lt;p&gt;Sin memoria, los LLMs operan en conversaciones de &lt;strong&gt;&amp;ldquo;single-turn&amp;rdquo;&lt;/strong&gt;: una sola pregunta y una sola respuesta. La información no persiste entre llamadas.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant L as LLM

 U-&gt;&gt;L: ¿Cuál es la capital de Francia?
 L-&gt;&gt;U: París
 Note over U,L: ❌ Sin contexto previo
 U-&gt;&gt;L: ¿Y su población?
 L-&gt;&gt;U: ¿De qué ciudad hablas?
 Note over L: No recuerda la conversación anterior
&lt;/pre&gt;

&lt;p&gt;Afortunadamente, hay muchas formas de agregar módulos de memoria. La forma más común es simplemente añadir la conversación previa al prompt actual:&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant M as Memoria
 participant L as LLM

 U-&gt;&gt;L: ¿Cuál es la capital de Francia?
 L-&gt;&gt;U: París
 L-&gt;&gt;M: Guardar contexto
 U-&gt;&gt;L: ¿Y su población?
 M-&gt;&gt;L: Contexto: hablamos de París
 L-&gt;&gt;U: París tiene ~2.1 millones de habitantes
 Note over L: ✅ Recuerda el contexto
&lt;/pre&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;Los módulos de memoria pueden ser complejos. Si recibimos demasiada información, se vuelve difícil de procesar, lo que puede llevar a malas decisiones. Esto se llama &lt;strong&gt;sobrecarga de información&lt;/strong&gt; y es un problema real incluso para los LLMs. Se necesita un balance entre la cantidad y calidad de la información en el prompt — esto es lo que se conoce como &lt;strong&gt;context engineering&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Los sistemas de memoria comparten similitudes con nuestros sistemas de memoria humana:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memoria a corto plazo&lt;/strong&gt;: La conversación actual, las últimas interacciones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria a largo plazo&lt;/strong&gt;: Hechos persistentes, preferencias del usuario, conocimiento acumulado&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="herramientas-tools"&gt;Herramientas (Tools)&lt;/h3&gt;
&lt;p&gt;Con la memoria, los LLMs recuerdan sus conversaciones previas, pero aún no son capaces de &lt;strong&gt;interactuar con su entorno&lt;/strong&gt;. Los LLMs pueden interactuar con su entorno digital a través de herramientas externas que amplían sus capacidades: calculadoras, motores de búsqueda, APIs, shells de comandos, y más.&lt;/p&gt;
&lt;p&gt;Sin embargo, los LLMs &lt;strong&gt;no son capaces de usar herramientas por sí mismos&lt;/strong&gt;. Fundamentalmente, un LLM es una función de texto-entrada/texto-salida. Solo puede &lt;em&gt;describir o expresar la intención&lt;/em&gt; de tomar una acción.&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant U as Usuario
 participant L as LLM
 participant R as Runtime / Orquestador
 participant T as Herramienta

 U-&gt;&gt;L: ¿Cuánto es 847 × 392?
 L-&gt;&gt;R: {"tool": "calculator", "params": {"expr": "847 * 392"}}
 Note over L,R: El LLM expresa INTENCIÓN
 R-&gt;&gt;T: Ejecutar cálculo
 T-&gt;&gt;R: 331,824
 R-&gt;&gt;L: Resultado: 331,824
 L-&gt;&gt;U: El resultado es 331,824
&lt;/pre&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;El LLM puede expresar la intención de usar una herramienta, pero depende de nosotros convertir esa intención en una llamada real. Necesitamos escribir software que interprete el output del LLM (generalmente JSON) para elegir la herramienta correcta y completar sus parámetros.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las herramientas varían en complejidad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simples&lt;/strong&gt;: Calculadoras, conversor de unidades&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intermedias&lt;/strong&gt;: Búsqueda web, consultas a bases de datos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complejas&lt;/strong&gt;: Acceso a terminal, entornos de código, APIs de GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="planificación-y-reflexión"&gt;Planificación y Reflexión&lt;/h3&gt;
&lt;p&gt;El ingrediente final para ir de un LLM &amp;ldquo;regular&amp;rdquo; a un Agente de IA es su capacidad de &lt;strong&gt;planificar y reflexionar&lt;/strong&gt;. Estas capacidades son fundamentales, ya que el agente necesita decidir qué pasos tomar, cómo tomarlos y cuándo.&lt;/p&gt;
&lt;h4 id="descomposición-de-tareas"&gt;Descomposición de tareas&lt;/h4&gt;
&lt;p&gt;Aquí es donde entra la planificación: descomponer una tarea grande en pasos más pequeños y ejecutables. Esto se conoce como &lt;strong&gt;task decomposition&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Q[📝 Query: Investiga papers recientes sobre RAG] --&gt; P[📋 Plan]
 P --&gt; T1[1. Buscar en Google Scholar]
 P --&gt; T2[2. Buscar en ArXiv]
 P --&gt; T3[3. Filtrar por fecha 2024-2025]
 P --&gt; T4[4. Leer abstracts relevantes]
 P --&gt; T5[5. Generar resumen comparativo]

 T1 --&gt; E[⚡ Ejecución secuencial]
 T2 --&gt; E
 T3 --&gt; E
 T4 --&gt; E
 T5 --&gt; E
&lt;/pre&gt;

&lt;h4 id="ejecución-iterativa-con-razonamiento"&gt;Ejecución iterativa con razonamiento&lt;/h4&gt;
&lt;p&gt;Al referirse continuamente a su plan, el LLM ejecuta cada tarea una por una. Hacerlas todas a la vez rara vez es eficiente, ya que cada tarea puede influir en otra. Después de completar una tarea específica, el LLM razona sobre qué pasos tomar a continuación.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 START[🎯 Objetivo] --&gt; PLAN[📋 Crear Plan]
 PLAN --&gt; EXEC[⚡ Ejecutar Tarea]
 EXEC --&gt; REASON[🤔 Razonar sobre resultado]
 REASON --&gt;|siguiente tarea| EXEC
 REASON --&gt;|plan completo| DONE[✅ Resultado Final]
 REASON --&gt;|ajustar plan| REFLECT[🔄 Reflexionar]
 REFLECT --&gt;|plan mejorado| PLAN
&lt;/pre&gt;

&lt;h4 id="reflexión"&gt;Reflexión&lt;/h4&gt;
&lt;p&gt;Crear un plan no es suficiente. El LLM puede descubrir a mitad del camino que algunos pasos no son apropiados. Por ejemplo, podría descubrir que Google y ArXiv son insuficientes y decidir agregar Semantic Scholar y PubMed como recursos adicionales.&lt;/p&gt;
&lt;p&gt;Este comportamiento &lt;strong&gt;reflexivo&lt;/strong&gt; hace que los agentes parezcan humanos: intentan descubrir sus fallos y hacer intentos por corregirlos. Al reflexionar sobre comportamiento pasado, el plan inicial puede mejorarse continuamente.&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;La planificación y reflexión crean un &lt;strong&gt;ciclo iterativo&lt;/strong&gt;: planificar tareas → ejecutar acciones → reflexionar sobre el resultado → ajustar el plan. Este ciclo es lo que diferencia a un verdadero agente de un simple modelo que responde preguntas. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Un agente de IA no es simplemente un LLM que responde preguntas. Es un sistema compuesto por:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Un LLM con razonamiento&lt;/strong&gt; como cerebro central&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria&lt;/strong&gt; para mantener contexto entre interacciones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Herramientas&lt;/strong&gt; para interactuar con el entorno digital&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planificación y reflexión&lt;/strong&gt; para abordar tareas complejas de forma iterativa&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph AGENT[🤖 Agente de IA]
 direction TB
 BRAIN[🧠 LLM con Razonamiento]
 MEM[💾 Memoria&lt;br/&gt;Corto y largo plazo]
 TOOLS[🔧 Herramientas&lt;br/&gt;APIs, búsqueda, código]
 PLAN[📋 Planificación&lt;br/&gt;Descomposición + Reflexión]

 MEM &lt;--&gt; BRAIN
 TOOLS &lt;--&gt; BRAIN
 PLAN &lt;--&gt; BRAIN
 end

 USER[👤 Usuario] &lt;--&gt;|interacción| AGENT
 AGENT &lt;--&gt;|percibe y actúa| ENV[🌍 Entorno]
&lt;/pre&gt;

&lt;p&gt;La próxima vez que interactúes con un asistente de IA que busca información, ejecuta código y ajusta su enfoque basándose en los resultados, estarás interactuando con un agente. Y ahora entiendes la maquinaria que lo hace posible.&lt;/p&gt;</content:encoded></item><item><title>Emociones y Manejo de las Mismas</title><link>https://blog.dacadev.com/soft-skills/emociones-y-manejo-de-las-mismas/</link><pubDate>Thu, 14 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/soft-skills/emociones-y-manejo-de-las-mismas/</guid><dc:creator>Dacadev</dc:creator><category>habilidades blandas</category><description>Descubre las 5 emociones básicas — miedo, ira, asco, alegría y tristeza — y aprende técnicas prácticas para gestionarlas en tu vida personal y profesional.</description><media:content url="https://blog.dacadev.com/images/soft-skills/emociones-manejo/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="#el-miedo"&gt;El Miedo&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#vulnerabilidad-cognitiva"&gt;Vulnerabilidad cognitiva&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#respuestas-naturales-ante-el-miedo"&gt;Respuestas naturales ante el miedo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-luchar-contra-el-miedo"&gt;¿Cómo luchar contra el miedo?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-ira"&gt;La Ira&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#cómo-manejar-la-ira"&gt;¿Cómo manejar la ira?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-salir-de-tu-propia-ira"&gt;¿Cómo salir de tu propia ira?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-asco"&gt;El Asco&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-nos-produce-asco"&gt;¿Qué nos produce asco?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#asco-y-xenofobia"&gt;Asco y xenofobia&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-tratar-el-asco-social"&gt;¿Cómo tratar el asco social?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-alegría"&gt;La Alegría&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#emociones-positivas-y-negativas"&gt;Emociones positivas y negativas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estados-emocionales-positivos"&gt;Estados emocionales positivos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#las-emociones-positivas-y-el-placer"&gt;Las emociones positivas y el placer&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-tristeza"&gt;La Tristeza&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#por-qué-experimentamos-tristeza"&gt;¿Por qué experimentamos tristeza?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-manejar-la-tristeza"&gt;¿Cómo manejar la tristeza?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#consejos-prácticos-para-procesar-la-tristeza"&gt;Consejos prácticos para procesar la tristeza&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#aplicando-la-gestión-emocional-en-tu-vida-profesional"&gt;Aplicando la gestión emocional en tu vida profesional&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;¿Alguna vez reaccionaste de una forma que después no pudiste explicar? ¿Explotaste en una reunión, sentiste un nudo en el estómago antes de una presentación o te invadió una tristeza profunda sin razón aparente? Todas esas experiencias tienen un origen común: tus &lt;strong&gt;emociones básicas&lt;/strong&gt;.&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;En este artículo exploraremos las cinco emociones básicas — miedo, ira, asco, alegría y tristeza — entenderemos por qué existen, cómo se manifiestan y, lo más importante, aprenderemos técnicas prácticas para gestionarlas. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las emociones no son buenas ni malas por sí mismas — son señales biológicas que nuestro cuerpo utiliza para comunicarnos algo. El verdadero poder está en aprender a escucharlas y gestionarlas.&lt;/p&gt;
&lt;pre class="mermaid"&gt;mindmap
 root((Emociones Básicas))
 😨 Miedo
 Alarma biológica
 Preservar seguridad
 Lucha, Huida, Congelamiento
 😡 Ira
 Resultado de frustración
 Inicio, Intensidad, Enfriamiento
 Respiración consciente
 🤢 Asco
 Mecanismo de defensa
 Asco físico y moral
 Antídoto: Empatía
 😄 Alegría
 Conjunto de emociones
 Estados positivos
 Flow, Resiliencia, Humor
 😢 Tristeza
 Respuesta a la pérdida
 Función adaptativa
 Función social
&lt;/pre&gt;

&lt;h2 id="el-miedo"&gt;El Miedo&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;miedo&lt;/strong&gt; es una emoción que sentimos a diario. Se genera como una alarma biológica de nuestro cuerpo ante una situación de peligro. Su principal objetivo es preservar nuestra seguridad, y cuando la sentimos, lo que hacemos por instinto es evaluar y responder ante la situación.&lt;/p&gt;
&lt;p&gt;Los miedos se generan a partir de experiencias, y estas se dan de dos maneras:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Estar presente&lt;/strong&gt; en la experiencia aversiva (vivir el momento directamente)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recibir noticias&lt;/strong&gt; de lo que puede pasar si estás en un lugar o situación similar&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="vulnerabilidad-cognitiva"&gt;Vulnerabilidad cognitiva&lt;/h3&gt;
&lt;p&gt;Sentimos miedo ante ciertos patrones que activan nuestra vulnerabilidad cognitiva:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Peligros&lt;/strong&gt; reales o percibidos&lt;/li&gt;
&lt;li&gt;Cosas que nos parecen &lt;strong&gt;asquerosas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Situaciones &lt;strong&gt;impredecibles&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Situaciones &lt;strong&gt;incontrolables&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="respuestas-naturales-ante-el-miedo"&gt;Respuestas naturales ante el miedo&lt;/h3&gt;
&lt;p&gt;Cuando el miedo aparece, nuestro cuerpo activa una de tres respuestas automáticas:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 M[😨 Miedo] --&gt; E{Evaluación}
 E --&gt;|"Puedo enfrentarlo"| L["⚔️ Lucha\nEnfrentar el problema"]
 E --&gt;|"Es demasiado"| H["🏃 Huida\nRetroceder y salir\nlo antes posible"]
 E --&gt;|"No sé qué hacer"| C["🧊 Congelamiento\nNo hacer nada\nante la situación"]
&lt;/pre&gt;

&lt;h3 id="cómo-luchar-contra-el-miedo"&gt;¿Cómo luchar contra el miedo?&lt;/h3&gt;
&lt;p&gt;Existe una técnica llamada &lt;strong&gt;la peor fantasía&lt;/strong&gt;, que consiste en exponerte voluntariamente al miedo en intervalos diarios hasta que poco a poco logres superarlo. La clave está en la exposición gradual y controlada.&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;El principal consejo para tratar con el miedo es: &lt;strong&gt;OBSERVAR&lt;/strong&gt;, &lt;strong&gt;EVALUAR&lt;/strong&gt; y &lt;strong&gt;CONFRONTAR&lt;/strong&gt;. No se trata de ser temerario, sino de enfrentar el miedo de manera consciente y progresiva.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-ira"&gt;La Ira&lt;/h2&gt;
&lt;p&gt;La ira es una de las emociones más atacadas socialmente. Pero, ¿realmente está mal enojarse? No necesariamente. El &lt;strong&gt;mal humor&lt;/strong&gt; es simplemente la ira en su forma pasiva — cuando estás de mal humor, estás enojado con respecto a alguna situación, objeto o persona.&lt;/p&gt;
&lt;p&gt;Cada persona tiene una forma diferente de expresar la ira, y esta se distribuye en tres fases:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 I["🔥 Inicio\nTiempo que tardas\nen detonarte"]
 --&gt;
 INT["💥 Intensidad\nFuerza con que\nestalla la emoción"]
 --&gt;
 ENF["❄️ Enfriamiento\nTiempo para salir\ndel estado de ira"]
&lt;/pre&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;La diferencia en la ira de persona a persona radica en los niveles de cada una de estas etapas. Por ejemplo, puede que haya personas que explotan rápidamente, pero así mismo se enfrían rápido. Otros tardan en detonarse pero la intensidad es mayor.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Algunos psicólogos relacionan la ira como el resultado de una &lt;strong&gt;frustración&lt;/strong&gt;, y creen que esta emoción permite tener un entendimiento más detallado de los acontecimientos.&lt;/p&gt;
&lt;h3 id="cómo-manejar-la-ira"&gt;¿Cómo manejar la ira?&lt;/h3&gt;
&lt;p&gt;Algo fundamental que debes tener en cuenta:&lt;/p&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;La ira alimenta a la ira. Es un círculo vicioso que se debe evitar a toda costa.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Al momento de tratar con alguien que está enojado, recuerda que un cerebro enojado quiere escuchar que tiene la razón. Esta puede ser una forma de ayudar a la persona a que se calme.&lt;/p&gt;
&lt;h3 id="cómo-salir-de-tu-propia-ira"&gt;¿Cómo salir de tu propia ira?&lt;/h3&gt;
&lt;p&gt;El método más empleado es la &lt;strong&gt;respiración consciente&lt;/strong&gt;: respirar profundamente de manera consciente durante 4 segundos y exhalar durante el mismo tiempo. Suena simple, pero es extraordinariamente efectivo porque interrumpe el ciclo automático de la ira.&lt;/p&gt;
&lt;h2 id="el-asco"&gt;El Asco&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;asco&lt;/strong&gt; es un mecanismo de defensa que nos ayuda a evitar el contacto con sustancias peligrosas. Entre los 6 y 8 años comenzamos a experimentar rechazo a lo que nos sabe mal, y a partir de ahí empezamos a desarrollar esta emoción.&lt;/p&gt;
&lt;h3 id="qué-nos-produce-asco"&gt;¿Qué nos produce asco?&lt;/h3&gt;
&lt;p&gt;Los mayores causantes de asco suelen ser &lt;strong&gt;productos corporales&lt;/strong&gt; tales como heces, vómito, mocos, sangre — en general, aquello que nos recuerda nuestra naturaleza animal.&lt;/p&gt;
&lt;p&gt;Pero no solo las secreciones corporales nos generan asco. Esta sensación también se presenta ante aquello que consideramos &lt;strong&gt;moralmente reprobable&lt;/strong&gt;, como ciertas acciones o actitudes de las personas.&lt;/p&gt;
&lt;h3 id="asco-y-xenofobia"&gt;Asco y xenofobia&lt;/h3&gt;
&lt;p&gt;Los racistas históricamente se refieren a sus víctimas como algo asqueroso o inanimado. La propaganda Nazi contra los judíos es un claro ejemplo de ingeniería social donde la repugnancia y el asco jugaron un papel esencial.&lt;/p&gt;
&lt;p&gt;En estos casos, se dice que existe un sentimiento de &lt;strong&gt;asco social&lt;/strong&gt; — una forma de deshumanizar al otro para justificar el maltrato.&lt;/p&gt;
&lt;h3 id="cómo-tratar-el-asco-social"&gt;¿Cómo tratar el asco social?&lt;/h3&gt;
&lt;p&gt;El medicamento para tratar el asco social es la &lt;strong&gt;empatía&lt;/strong&gt;: la habilidad de identificarnos y ponernos en el lugar de los demás con el propósito de entender lo que realmente sienten.&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;Cuando sientas rechazo hacia una persona o grupo, pregúntate: ¿es un asco genuino o es un sesgo social que he aprendido? La respuesta honesta puede transformar tu perspectiva.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-alegría"&gt;La Alegría&lt;/h2&gt;
&lt;p&gt;El concepto de &lt;strong&gt;alegría&lt;/strong&gt; es variado y se puede experimentar de formas diferentes. Para entenderlo mejor, trata de recordar la última experiencia alegre que tuviste: ¿sentiste emoción, excitación u orgullo?&lt;/p&gt;
&lt;p&gt;Debido a su naturaleza, la alegría es inespecífica y varía de persona a persona: podemos dar saltos de alegría, llorar, bromear o hacer planes para el futuro.&lt;/p&gt;
&lt;h3 id="emociones-positivas-y-negativas"&gt;Emociones positivas y negativas&lt;/h3&gt;
&lt;p&gt;La alegría no es una sola emoción, sino un &lt;strong&gt;conjunto de muchas emociones&lt;/strong&gt; que pueden ser negativas o positivas. Ambas se complementan y son importantes para nuestra evolución:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las &lt;strong&gt;emociones negativas&lt;/strong&gt; nos ayudan a solucionar problemas de supervivencia inmediata&lt;/li&gt;
&lt;li&gt;Las &lt;strong&gt;emociones positivas&lt;/strong&gt; apoyan la resolución de problemas de desarrollo, crecimiento personal y conexión social&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las emociones desagradables aumentan la actividad cardiovascular, la presión sanguínea y la frecuencia cardíaca. Las positivas, por el contrario, relajan nuestro cuerpo y generan bienestar.&lt;/p&gt;
&lt;h3 id="estados-emocionales-positivos"&gt;Estados emocionales positivos&lt;/h3&gt;
&lt;p&gt;En psicología se identifican varios estados emocionales positivos clave:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
 A["🌟 Estados Emocionales Positivos"] --&gt; E["⬆️ Elevación\nSensación de afecto en el pecho\nal presenciar actos altruistas"]
 A --&gt; F["🎯 Flow\nInvolucrarte 100%\nen una actividad"]
 A --&gt; R["💪 Resiliencia\nCapacidad de recuperarse\nde la adversidad y\ntransformarla en positivo"]
 A --&gt; H["😄 Humor\nFortaleza que baja\nla tensión y alivia\nel sufrimiento"]
&lt;/pre&gt;

&lt;h3 id="las-emociones-positivas-y-el-placer"&gt;Las emociones positivas y el placer&lt;/h3&gt;
&lt;p&gt;Las emociones positivas por actividades ajenas a nuestro carácter pueden provocar desolación, falta de autenticidad, depresión e insatisfacción.&lt;/p&gt;
&lt;p&gt;Durante años hemos inventado fórmulas para sentirnos bien: drogas, consumismo, viajes, validación social. Sin embargo, esto provocó que buscáramos una felicidad efímera — lo que se conoce como &lt;strong&gt;positividad tóxica&lt;/strong&gt; — que no lleva a una alegría a largo plazo.&lt;/p&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;La buena vida se alcanza reconociendo y fortaleciendo las virtudes personales. A veces está bien sentirse mal — negar las emociones negativas es tan dañino como quedarse atrapado en ellas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-tristeza"&gt;La Tristeza&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;tristeza&lt;/strong&gt; es una respuesta emocional a la pérdida, ya sea en una situación del presente, del pasado o en un posible futuro. Puede ser causada por la pérdida de amistades, amores, autoestima, trabajos, salud, entre otras circunstancias.&lt;/p&gt;
&lt;p&gt;Las formas de expresión más comunes son el pesimismo, la culpa, el llanto y la desesperanza.&lt;/p&gt;
&lt;h3 id="por-qué-experimentamos-tristeza"&gt;¿Por qué experimentamos tristeza?&lt;/h3&gt;
&lt;p&gt;La tristeza cumple dos funciones fundamentales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Función adaptativa&lt;/strong&gt;: nos pone en pausa para reflexionar y procesar la pérdida. Es la forma que tiene nuestro cerebro de forzarnos a detenernos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Función social&lt;/strong&gt;: nos permite recibir apoyo y pedir ayuda. Como dijo Paul Ekman: &lt;em&gt;&amp;ldquo;La tristeza nos ayuda a imponer sufrimiento propio sobre los demás para que vengan a ayudarnos&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cómo-manejar-la-tristeza"&gt;¿Cómo manejar la tristeza?&lt;/h3&gt;
&lt;p&gt;Si alguien que está atravesando por un episodio de tristeza te pide ayuda, &lt;strong&gt;trata de escucharlo&lt;/strong&gt;, puesto que cuando la tristeza se vuelve des-adaptativa, puede convertirse en depresión.&lt;/p&gt;
&lt;p&gt;Cuando tú estés atravesando por una situación compleja, &lt;strong&gt;permítete estar triste&lt;/strong&gt;. No existe una fórmula mágica — cada quien transita esta emoción en su propio tiempo y con sus herramientas.&lt;/p&gt;
&lt;h3 id="consejos-prácticos-para-procesar-la-tristeza"&gt;Consejos prácticos para procesar la tristeza&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escuchar música triste o ver películas tristes&lt;/strong&gt;: la universalidad de la experiencia humana te hace experimentar la tristeza como una emoción natural&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llorar&lt;/strong&gt;: libera hormonas en el cerebro que ayudan a la regulación del estado de ánimo y del estrés&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practicar actividad física&lt;/strong&gt;: con 20 minutos de caminata al día estarás ayudando a tu cuerpo a sentirse mejor&lt;/li&gt;
&lt;/ul&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;Reconoce que cuando estás triste, tu mente solo se enfoca en ti: intenta abrirla de manera consciente hacia los demás. Muchas veces, ayudar a otros es la mejor forma de ayudarte a ti mismo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="aplicando-la-gestión-emocional-en-tu-vida-profesional"&gt;Aplicando la gestión emocional en tu vida profesional&lt;/h2&gt;
&lt;p&gt;¿Qué tiene que ver todo esto con tu carrera como profesional? Absolutamente todo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;El miedo&lt;/strong&gt; antes de una presentación o entrevista se gestiona con preparación y exposición gradual&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La ira&lt;/strong&gt; en una discusión de code review se maneja con respiración consciente y escucha activa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El asco social&lt;/strong&gt; en equipos diversos se combate con empatía genuina&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La alegría&lt;/strong&gt; sostenible en el trabajo viene de actividades alineadas con tus valores, no de validación externa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La tristeza&lt;/strong&gt; ante un fracaso profesional es natural — permítete sentirla y luego transforma la experiencia&lt;/li&gt;
&lt;/ul&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;La inteligencia emocional no es un talento innato — es una habilidad que se entrena día a día. Cada vez que observas, evalúas y gestionas una emoción conscientemente, estás fortaleciendo un músculo que te hará mejor profesional y mejor persona. 🚀&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Manejo de emociones para la productividad y la organización</title><link>https://blog.dacadev.com/soft-skills/manejo-de-emociones-para-la-productividad/</link><pubDate>Thu, 14 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/soft-skills/manejo-de-emociones-para-la-productividad/</guid><dc:creator>Dacadev</dc:creator><category>habilidades blandas</category><description>Aprende a gestionar la impulsividad, el estrés y el síndrome del impostor para ser más productivo. Estrategias prácticas de inteligencia emocional aplicadas al trabajo.</description><media:content url="https://blog.dacadev.com/images/soft-skills/emotional-productivity/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="#aprender-a-manejar-la-impulsividad"&gt;Aprender a manejar la impulsividad&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-la-hiperactividad"&gt;¿Qué es la hiperactividad?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cuándo-actúas-y-cuándo-reaccionas"&gt;¿Cuándo actúas y cuándo reaccionas?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-controlar-la-impulsividad"&gt;¿Cómo controlar la impulsividad?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#hyper-focusing-aprovecha-tu-atención-sin-desgastarte"&gt;Hyper focusing: aprovecha tu atención sin desgastarte&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#cómo-manejar-un-estado-de-hyper-focus"&gt;Cómo manejar un estado de hyper focus&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#meltdowns-y-burnout-cómo-evitarlos"&gt;Meltdowns y burnout: cómo evitarlos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-respuesta-de-estrés-agudo"&gt;La respuesta de estrés agudo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-detectar-el-estrés"&gt;Cómo detectar el estrés&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#oposicionalidad-estrategias-para-lidiar-con-la-frustración"&gt;Oposicionalidad: estrategias para lidiar con la frustración&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#cómo-superar-el-síndrome-del-impostor-y-usarlo-a-tu-favor"&gt;Cómo superar el síndrome del impostor y usarlo a tu favor&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#causas-comunes"&gt;Causas comunes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#síndrome-del-impostor-vs-efecto-dunning-kruger"&gt;Síndrome del impostor vs. Efecto Dunning-Kruger&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-humildad-como-herramienta"&gt;La humildad como herramienta&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#satisfacción-enfócate-en-el-proceso-más-que-en-el-resultado"&gt;Satisfacción: enfócate en el proceso más que en el resultado&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#marca-sucesos-que-señalen-tu-progreso"&gt;Marca sucesos que señalen tu progreso&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#suaviza-la-curva-de-aprendizaje"&gt;Suaviza la curva de aprendizaje&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#date-feedback-a-ti-mismo"&gt;Date feedback a ti mismo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pon-atención-a-las-ganancias-secundarias"&gt;Pon atención a las ganancias secundarias&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#adaptate-al-ambiente"&gt;Adapta(te) al ambiente&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#eres-una-alondra-o-un-búho"&gt;¿Eres una &amp;ldquo;alondra&amp;rdquo; o un &amp;ldquo;búho&amp;rdquo;?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#entiende-qué-dimensiones-de-tu-trabajo-son-talacha-o-creatividad"&gt;Entiende qué dimensiones de tu trabajo son &amp;ldquo;talacha&amp;rdquo; o creatividad&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#considera-el-clima"&gt;Considera el clima&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#dale-lugar-a-tus-necesidades-fisiológicas"&gt;Dale lugar a tus necesidades fisiológicas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-ocio-recarga-combustible"&gt;El ocio recarga combustible&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;¿Alguna vez respondiste un correo con frustración y después te arrepentiste? ¿Te descubriste saltando de tarea en tarea sin terminar ninguna? ¿O sentiste que no merecías ese ascenso que tanto trabajaste para lograr? Todas esas experiencias tienen algo en común: tus &lt;strong&gt;emociones están al volante&lt;/strong&gt; y tú vas en el asiento trasero.&lt;/p&gt;
&lt;p&gt;La productividad no es solo cuestión de herramientas, metodologías o listas de tareas — es, fundamentalmente, un ejercicio de &lt;strong&gt;gestión emocional&lt;/strong&gt;. Si no entiendes cómo tus emociones afectan tu rendimiento, ningún framework de productividad va a salvarte.&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;En este artículo vamos a explorar cómo manejar la impulsividad, el hyper focus, el estrés, el síndrome del impostor y la frustración para convertir tus emociones en aliadas de tu productividad. 🧠&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="aprender-a-manejar-la-impulsividad"&gt;Aprender a manejar la impulsividad&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;impulsividad&lt;/strong&gt; es la incapacidad de controlar tus impulsos propios. Pero antes de que la juzgues como algo negativo, déjame decirte que tiene una función importante:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Salir del letargo&lt;/strong&gt; o el aburrimiento&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Romper la tensión&lt;/strong&gt; en momentos de presión&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llevar a la acción&lt;/strong&gt; cuando necesitas moverte&lt;/li&gt;
&lt;/ul&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;La impulsividad no es un defecto — es una &lt;strong&gt;reacción&lt;/strong&gt;. Lo que importa es cómo la canalizas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="qué-es-la-hiperactividad"&gt;¿Qué es la hiperactividad?&lt;/h3&gt;
&lt;p&gt;La hiperactividad es básicamente una &lt;strong&gt;impulsividad desbordada&lt;/strong&gt;. Se puede manifestar como hiperactividad de pensamiento, de movimiento, o ambas. Las personas hiperactivas suelen ser &lt;strong&gt;hipersensibles al ambiente&lt;/strong&gt; y su sistema nervioso se altera con facilidad.&lt;/p&gt;
&lt;p&gt;Lo interesante es que la hiperactividad puede ser tremendamente útil dependiendo del contexto. No se trata de eliminarla, sino de aprender cuándo aprovecharla.&lt;/p&gt;
&lt;h3 id="cuándo-actúas-y-cuándo-reaccionas"&gt;¿Cuándo actúas y cuándo reaccionas?&lt;/h3&gt;
&lt;p&gt;Esta es una distinción crucial para tu productividad:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 P["🧠 Situación"] --&gt; D{¿Qué haces?}
 D --&gt;|"Piensas y analizas"| A["✅ Actúas\nDecisión consciente"]
 D --&gt;|"Lo primero que se te ocurre"| R["⚡ Reaccionas\nRespuesta impulsiva"]
 A --&gt; B["📈 Mayor aprendizaje\ny mejores resultados"]
 R --&gt; C["🔄 Resultados\nimpredecibles"]
&lt;/pre&gt;

&lt;p&gt;Reconocer en qué estado estás en cada momento te permite obtener mayor provecho de las situaciones. Cuando identificas que estás &lt;strong&gt;reaccionando&lt;/strong&gt;, puedes frenar y pasar a &lt;strong&gt;actuar&lt;/strong&gt; conscientemente.&lt;/p&gt;
&lt;p&gt;Analizar estas situaciones te permite generar &lt;strong&gt;restricciones saludables&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rutinas&lt;/strong&gt; que automaticen decisiones repetitivas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presupuestos&lt;/strong&gt; de tiempo y energía&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Formatos&lt;/strong&gt; y plantillas para tareas comunes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Listas&lt;/strong&gt; que liberen carga cognitiva&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cómo-controlar-la-impulsividad"&gt;¿Cómo controlar la impulsividad?&lt;/h3&gt;
&lt;p&gt;La próxima vez que sientas un impulso, hazte esta pregunta:&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;&lt;strong&gt;¿Cuál es la experiencia que me dará esta decisión?&lt;/strong&gt; Pausar para hacerte esta pregunta puede ser la diferencia entre actuar y reaccionar.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Además, regula el uso de estimulantes — por ejemplo, el café. No se trata de eliminarlo, sino de ser consciente de cómo afecta tu nivel de impulsividad.&lt;/p&gt;
&lt;h2 id="hyper-focusing-aprovecha-tu-atención-sin-desgastarte"&gt;Hyper focusing: aprovecha tu atención sin desgastarte&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;hyper focus&lt;/strong&gt; es un estado de atención absoluta y sostenida durante un largo periodo de tiempo. Es una concentración tan focalizada que pierdes de vista lo que sucede a tu alrededor. A veces se le conoce como &lt;strong&gt;flow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cualquier persona puede entrar en hyper focus, aunque parece haber una tendencia mayor en personas con TDAH.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 HF["🎯 Hyper Focus"] --&gt; V["✅ Ventajas"]
 HF --&gt; D["⚠️ Desventajas"]
 V --&gt; V1["Concentración profunda"]
 V --&gt; V2["Alta energía"]
 V --&gt; V3["Sensación de placer"]
 V --&gt; V4["Máxima productividad"]
 D --&gt; D1["Olvido de otras tareas"]
 D --&gt; D2["Descuido personal"]
 D --&gt; D3["Falso superpoder"]
&lt;/pre&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;El hyper focus que excluye la atención al ambiente también denota una &lt;strong&gt;pobre regulación de la atención&lt;/strong&gt;. No todo flow es saludable.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="cómo-manejar-un-estado-de-hyper-focus"&gt;Cómo manejar un estado de hyper focus&lt;/h3&gt;
&lt;p&gt;Si identificas que el hyper focus te atrapa con frecuencia, estas estrategias te ayudarán:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Detecta qué actividades lo despiertan&lt;/strong&gt; — conócete y anticípate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evita esas actividades cuando hay algo urgente&lt;/strong&gt; pendiente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usa recordatorios&lt;/strong&gt; para comer, beber agua e ir al baño&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rómpelo con movimiento&lt;/strong&gt; — camina, baila, brinca, date una ducha&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementa una rutina con pausas&lt;/strong&gt; cada vez que alcances una meta parcial&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="meltdowns-y-burnout-cómo-evitarlos"&gt;Meltdowns y burnout: cómo evitarlos&lt;/h2&gt;
&lt;h3 id="la-respuesta-de-estrés-agudo"&gt;La respuesta de estrés agudo&lt;/h3&gt;
&lt;p&gt;El &lt;strong&gt;estrés&lt;/strong&gt; es una función natural y necesaria del organismo. Sirve para protegernos en situaciones de emergencia y coincide con la respuesta del sistema nervioso simpático: &lt;strong&gt;luchar, huir o congelarse&lt;/strong&gt;.&lt;/p&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;El estrés no es malo por sí mismo. Se &amp;ldquo;oculta&amp;rdquo; de la percepción, pero se manifiesta en sus efectos. El problema no es sentir estrés — es no saber que lo estás sintiendo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El equilibrio es clave: muy poco estrés lleva al aburrimiento y la falta de motivación. Demasiado estrés genera tensión y pánico.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 PE["😴 Poco estrés\nAburrimiento\nFalta de motivación\nDistracción"]
 --&gt; O["🎯 Estrés óptimo\nConcentración\nMotivación\nRendimiento"]
 --&gt; ME["😰 Mucho estrés\nTensión\nPánico\nBloqueo"]
&lt;/pre&gt;

&lt;h3 id="cómo-detectar-el-estrés"&gt;Cómo detectar el estrés&lt;/h3&gt;
&lt;p&gt;El estrés se esconde, pero deja señales claras. Aprende a leer tu cuerpo y tu comportamiento:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Señales emocionales y físicas:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alteración del sueño&lt;/li&gt;
&lt;li&gt;Cansancio constante&lt;/li&gt;
&lt;li&gt;Baja motivación&lt;/li&gt;
&lt;li&gt;Cambios de humor e irritación fácil&lt;/li&gt;
&lt;li&gt;Tristeza constante u obsesión&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Señales conductuales:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cambios en la alimentación&lt;/li&gt;
&lt;li&gt;Consumo de sustancias para la evasión&lt;/li&gt;
&lt;li&gt;Conductas impulsivas&lt;/li&gt;
&lt;li&gt;Comportamientos compulsivos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="oposicionalidad-estrategias-para-lidiar-con-la-frustración"&gt;Oposicionalidad: estrategias para lidiar con la frustración&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;frustración&lt;/strong&gt; es una emoción inevitable en cualquier entorno laboral. No puedes evitarla, pero sí puedes aprender a gestionarla. La clave está en entender que la frustración no es un enemigo — es una señal de que algo necesita tu atención.&lt;/p&gt;
&lt;p&gt;Cuando te sientas frustrado, el primer paso es &lt;strong&gt;detenerte y analizar&lt;/strong&gt; qué situación te llevó a ese estado. ¿Es algo que puedes cambiar? ¿Depende de ti? ¿Qué emoción hay detrás de la frustración?&lt;/p&gt;
&lt;h2 id="cómo-superar-el-síndrome-del-impostor-y-usarlo-a-tu-favor"&gt;Cómo superar el síndrome del impostor y usarlo a tu favor&lt;/h2&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;El síndrome del impostor no se trata de la duda, sino de la &lt;strong&gt;catástrofe&lt;/strong&gt;: es como una alarma de incendios que se activa con cualquier fuente de humo, por pequeña que sea. 🔥&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El &lt;strong&gt;síndrome del impostor&lt;/strong&gt; puede ser un gran aliado para comprender tu progreso. Sin embargo, también te conecta con tus miedos más profundos. La clave es aprender a escucharlo sin dejarte paralizar.&lt;/p&gt;
&lt;h3 id="causas-comunes"&gt;Causas comunes&lt;/h3&gt;
&lt;p&gt;Analiza qué situaciones te llevan a experimentar el síndrome del impostor. Algunas de las más comunes son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las &lt;strong&gt;críticas de alguien a quien admiras&lt;/strong&gt; en el trabajo&lt;/li&gt;
&lt;li&gt;Darte cuenta de que eras un buen estudiante, pero &lt;strong&gt;el mundo laboral funciona diferente&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compararte constantemente con los demás&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="síndrome-del-impostor-vs-efecto-dunning-kruger"&gt;Síndrome del impostor vs. Efecto Dunning-Kruger&lt;/h3&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 SI["🤔 Síndrome del impostor\nCrees que sabes menos\nde lo que realmente sabes"]
 --&gt;|"A largo plazo"| M["📈 Mejora\nde capacidades"]
 DK["😎 Efecto Dunning-Kruger\nCrees que sabes más\nde lo que realmente sabes"]
 --&gt;|"A largo plazo"| E["📉 Estancamiento\ny errores"]
&lt;/pre&gt;

&lt;p&gt;A largo plazo, el síndrome del impostor puede llevarte a &lt;strong&gt;mejorar tus capacidades&lt;/strong&gt; continuamente. Esto es lo opuesto al Efecto Dunning-Kruger, donde crees que sabes más de lo que realmente sabes.&lt;/p&gt;
&lt;h3 id="la-humildad-como-herramienta"&gt;La humildad como herramienta&lt;/h3&gt;
&lt;p&gt;Cuando el síndrome del impostor te afecta, tendemos a &lt;strong&gt;no apreciar objetivamente nuestros logros&lt;/strong&gt;. Para combatir esto:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Siéntete orgulloso&lt;/strong&gt; de lo que logras día a día&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usa los ojos de los demás&lt;/strong&gt; — pregunta a quienes te rodean cómo te perciben, cuáles son tus fortalezas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Establece metas con límites&lt;/strong&gt; — define metas ambiciosas (límites superiores) y pequeños logros alcanzables (límites inferiores). Si te mantienes dentro de ese rango, vas bien&lt;/li&gt;
&lt;/ol&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;Recuerda: &lt;strong&gt;tú no eres tus logros ni tus fracasos — eres el proceso&lt;/strong&gt;. Tus resultados son consecuencias de tus procesos, así que reconoce los pasos que has dado para llegar hasta donde estás. 💪&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="satisfacción-enfócate-en-el-proceso-más-que-en-el-resultado"&gt;Satisfacción: enfócate en el proceso más que en el resultado&lt;/h2&gt;
&lt;p&gt;Solemos entender la satisfacción como algo que ocurre cuando nos sale bien algo. Sin embargo, la satisfacción real es el resultado de un proceso diferente: &lt;strong&gt;la atención&lt;/strong&gt;. Y esa atención debe estar puesta en el &lt;strong&gt;desarrollo&lt;/strong&gt; de lo que hacemos, no en el efecto final.&lt;/p&gt;
&lt;h3 id="marca-sucesos-que-señalen-tu-progreso"&gt;Marca sucesos que señalen tu progreso&lt;/h3&gt;
&lt;p&gt;En lugar de decir &amp;ldquo;no logré esto&amp;rdquo;, piensa: &lt;strong&gt;&amp;ldquo;este fue el proceso para llegar hasta este punto&amp;rdquo;&lt;/strong&gt;. Con el tiempo tendemos a menospreciar el desarrollo de las situaciones y enfocarnos solo en logros y fracasos, lo cual lleva directo a la frustración.&lt;/p&gt;
&lt;h3 id="suaviza-la-curva-de-aprendizaje"&gt;Suaviza la curva de aprendizaje&lt;/h3&gt;
&lt;p&gt;Clasifica tus tareas en función de las &lt;strong&gt;habilidades requeridas&lt;/strong&gt; y su &lt;strong&gt;nivel de dificultad&lt;/strong&gt;. Luego resuelve primero las que te den las habilidades necesarias para avanzar a las siguientes. Es como subir escalones en lugar de intentar saltar al último piso.&lt;/p&gt;
&lt;h3 id="date-feedback-a-ti-mismo"&gt;Date feedback a ti mismo&lt;/h3&gt;
&lt;p&gt;Procura analizar qué sentiste ante una situación determinada y qué te gustaría que sucediera después. Hazte estas preguntas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;¿Qué he hecho bien?&lt;/li&gt;
&lt;li&gt;¿Qué podría hacer mejor?&lt;/li&gt;
&lt;li&gt;Al final, &lt;strong&gt;no reflexiones solo en si lo lograste o no&lt;/strong&gt; — analiza qué te llevó a lograrlo (o no)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pon-atención-a-las-ganancias-secundarias"&gt;Pon atención a las ganancias secundarias&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;ganancia secundaria&lt;/strong&gt; es una consecuencia positiva e inesperada del proceso. Puedes detectarlas con esta pregunta:&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;¿Existe algún descubrimiento o situación inesperada y positiva que surgió de una experiencia desagradable, frustrante o que no se considere como un logro?&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="adaptate-al-ambiente"&gt;Adapta(te) al ambiente&lt;/h2&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;&lt;strong&gt;Adaptarnos al ambiente ayuda a que todos los conceptos que hemos aprendido funcionen de mejor manera.&lt;/strong&gt; No se trata solo de gestionar emociones — se trata de crear el entorno que las favorezca. 🌿&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="eres-una-alondra-o-un-búho"&gt;¿Eres una &amp;ldquo;alondra&amp;rdquo; o un &amp;ldquo;búho&amp;rdquo;?&lt;/h3&gt;
&lt;p&gt;Eres una &lt;strong&gt;alondra&lt;/strong&gt; 🐦 si eres más creativo y enfocado durante el día. Eres un &lt;strong&gt;búho&lt;/strong&gt; 🦉 si funcionas mejor de noche. Identificar en qué momento del día te desempeñas mejor es el primer paso para organizar tu productividad.&lt;/p&gt;
&lt;h3 id="entiende-qué-dimensiones-de-tu-trabajo-son-talacha-o-creatividad"&gt;Entiende qué dimensiones de tu trabajo son &amp;ldquo;talacha&amp;rdquo; o creatividad&lt;/h3&gt;
&lt;p&gt;Una vez que conoces tus horarios óptimos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tareas creativas y de alta energía&lt;/strong&gt; → en tu horario de máximo rendimiento&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tareas repetitivas o de bajo esfuerzo mental&lt;/strong&gt; → en los horarios restantes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="considera-el-clima"&gt;Considera el clima&lt;/h3&gt;
&lt;p&gt;Puede sonar sorprendente, pero la temperatura, la lluvia y las condiciones climáticas &lt;strong&gt;afectan tus procesos psicoemocionales&lt;/strong&gt;. Identificar cómo el clima te impacta te permitirá planear tus tareas de manera más inteligente.&lt;/p&gt;
&lt;h3 id="dale-lugar-a-tus-necesidades-fisiológicas"&gt;Dale lugar a tus necesidades fisiológicas&lt;/h3&gt;
&lt;p&gt;Hay personas que no pueden trabajar sin antes haber ordenado su cuarto, meditado o desayunado. Si tienes ciertas compulsiones previas al trabajo, &lt;strong&gt;no las ignores&lt;/strong&gt; — siempre y cuando no perjudiquen tu rendimiento o el de los demás.&lt;/p&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;No te castigues con falta de sueño, agua o comida hasta terminar el trabajo. Desatender tus necesidades básicas te traerá problemas a la larga. Toma pausas para caminar, respirar y &lt;strong&gt;activar tu sistema cardiovascular&lt;/strong&gt;. 🏃&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="el-ocio-recarga-combustible"&gt;El ocio recarga combustible&lt;/h3&gt;
&lt;p&gt;El ocio no es malo — al contrario, es natural y necesario. Gracias a él activamos la &lt;strong&gt;atención pasiva&lt;/strong&gt;, que nos permite recargar energía emocional.&lt;/p&gt;
&lt;p&gt;Jugar, salir a caminar, hablar con amigos — estas actividades no son pérdida de tiempo. Son el combustible que necesitas para volver a ser productivo.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
 A["🔋 Ciclo de Productividad Emocional"]
 A --&gt; T["🎯 Trabajo enfocado\nTareas creativas y de alta energía\nen tu mejor horario"]
 T --&gt; P["⏸️ Pausas activas\nMovimiento, hidratación\nnecesidades fisiológicas"]
 P --&gt; O["🎮 Ocio y descanso\nAtención pasiva\nRecarga emocional"]
 O --&gt; R["🔄 Reflexión\nFeedback personal\nGanancias secundarias"]
 R --&gt; T
&lt;/pre&gt;
</content:encoded></item></channel></rss>