<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Programming on Commentary of Takao</title><link>https://takao.blog/es/tags/programming/</link><description>Recent content in Programming on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>Commentary of Takao</copyright><lastBuildDate>Sun, 12 Jul 2026 04:12:51 +0900</lastBuildDate><atom:link href="https://takao.blog/es/tags/programming/index.xml" rel="self" type="application/rss+xml"/><item><title>Agentes de IA para refactorización de código</title><link>https://takao.blog/es/web/ai-agents-codebase-refactoring-future/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/ai-agents-codebase-refactoring-future/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-agents-codebase-refactoring-future-es.png" alt="Featured image of post Agentes de IA para refactorización de código" /&gt;&lt;p&gt;Los agentes de IA como Cursor, Copilot Workspace y Claude pueden refactorizar código base de forma autónoma. El futuro del desarrollo incluye colaboración humano-agente.&lt;/p&gt;
&lt;h2 id="capacidades-actuales"&gt;Capacidades actuales
&lt;/h2&gt;&lt;p&gt;Refactorización de nombres, extracción de funciones, división de módulos, migración de APIs. Los agentes entienden el contexto del proyecto y aplican cambios.&lt;/p&gt;
&lt;h2 id="límites"&gt;Límites
&lt;/h2&gt;&lt;p&gt;Los agentes pueden introducir bugs sutiles. No entienden completamente la intención del negocio. La revisión humana sigue siendo necesaria.&lt;/p&gt;
&lt;h2 id="flujo-de-trabajo"&gt;Flujo de trabajo
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Describe el refactor. 2. El agente analiza el código. 3. Propone cambios. 4. Revisas y apruebas. 5. El agente aplica. 6. Pruebas automáticas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="futuro"&gt;Futuro
&lt;/h2&gt;&lt;p&gt;Agentes especializados por dominio, integración con CI/CD, aprendizaje del estilo del equipo, refactorizaciones multi-repositorio.&lt;/p&gt;</description></item><item><title>Tipos no mapeados y utilidades avanzadas de TypeScript</title><link>https://takao.blog/es/web/typescript-unmapped-types-utility/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-unmapped-types-utility/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-unmapped-types-utility-es.png" alt="Featured image of post Tipos no mapeados y utilidades avanzadas de TypeScript" /&gt;&lt;p&gt;Más allá de los mapped types, TypeScript ofrece patrones avanzados como tipos condicionales distributivos, tipos recursivos y operaciones sobre uniones y e intersecciones.&lt;/p&gt;
&lt;h2 id="tipos-condicionales-distributivos"&gt;Tipos condicionales distributivos
&lt;/h2&gt;&lt;p&gt;Cuando un tipo condicional recibe un tipo unión, la condición se aplica a cada miembro individualmente: &lt;code&gt;T extends U ? X : Y&lt;/code&gt; con T = A | B produce (A extends U ? X : Y) | (B extends U ? X : Y).&lt;/p&gt;</description></item><item><title>Parsers a nivel de tipos con Template Literal Types</title><link>https://takao.blog/es/web/typescript-template-literal-type-level-parsers/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-template-literal-type-level-parsers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-template-literal-type-level-parsers-es.png" alt="Featured image of post Parsers a nivel de tipos con Template Literal Types" /&gt;&lt;p&gt;Los template literal types combinados con inferencia condicional permiten construir parsers que operan exclusivamente en tiempo de compilación, analizando cadenas como rutas, formatos y DSLs.&lt;/p&gt;
&lt;h2 id="conceptos-básicos"&gt;Conceptos básicos
&lt;/h2&gt;&lt;p&gt;Usar &lt;code&gt;T extends &lt;/code&gt;${pattern}${infer Rest}&lt;code&gt; ? ... : never&lt;/code&gt; para extraer partes de una cadena recursivamente. Cada paso consume un token.&lt;/p&gt;
&lt;h2 id="parseo-de-rutas"&gt;Parseo de rutas
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ParseRoute&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;infer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Segment&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;infer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Rest&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;Segment&lt;/span&gt;, ...&lt;span style="color:#a6e22e"&gt;ParseRoute&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;Rest&lt;/span&gt;&amp;gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="validación-de-formatos"&gt;Validación de formatos
&lt;/h2&gt;&lt;p&gt;Validar UUIDs, fechas ISO, versiones semver, rutas de archivos. Los errores se detectan en tiempo de compilación con mensajes claros.&lt;/p&gt;</description></item><item><title>Ramas en el sistema de tipos de TypeScript: Introducción a Conditional Types</title><link>https://takao.blog/es/web/typescript-conditional-types/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-conditional-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-conditional-types-es.png" alt="Featured image of post Ramas en el sistema de tipos de TypeScript: Introducción a Conditional Types" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;Los conditional types permiten lógica a nivel de tipos: &lt;code&gt;T extends U ? X : Y&lt;/code&gt;. Esto permite resolución de tipos dinámica y consciente del contexto.&lt;/p&gt;
&lt;h2 id="sintaxis-básica"&gt;Sintaxis básica
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;type IsString&amp;lt;T&amp;gt; = T extends string ? true : false;&lt;/code&gt; La condición pregunta: &amp;ldquo;¿Es &lt;code&gt;T&lt;/code&gt; asignable a &lt;code&gt;U&lt;/code&gt;?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="la-palabra-clave-infer"&gt;La palabra clave infer
&lt;/h2&gt;&lt;p&gt;Extrae un tipo desde dentro de una condición: &lt;code&gt;type ReturnType&amp;lt;T&amp;gt; = T extends (...args: any[]) =&amp;gt; infer R ? R : never;&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Tipos mapeados en TypeScript: Transformación de tipos</title><link>https://takao.blog/es/web/typescript-mapped-types/</link><pubDate>Mon, 10 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-mapped-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-mapped-types-es.png" alt="Featured image of post Tipos mapeados en TypeScript: Transformación de tipos" /&gt;&lt;p&gt;Los tipos mapeados transforman un tipo existente iterando sobre sus propiedades. Son la base de utilidades como &lt;code&gt;Partial&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Readonly&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Pick&amp;lt;T, K&amp;gt;&lt;/code&gt; y &lt;code&gt;Record&amp;lt;K, V&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="sintaxis-básica"&gt;Sintaxis básica
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { [&lt;span style="color:#a6e22e"&gt;P&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;keyof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;]&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;P&lt;/span&gt;] &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Itera sobre &lt;code&gt;keyof T&lt;/code&gt; y aplica una transformación a cada propiedad.&lt;/p&gt;
&lt;h2 id="modificadores"&gt;Modificadores
&lt;/h2&gt;&lt;p&gt;Añadir o remover &lt;code&gt;readonly&lt;/code&gt; y &lt;code&gt;?&lt;/code&gt; con prefijos &lt;code&gt;+&lt;/code&gt; y &lt;code&gt;-&lt;/code&gt;: &lt;code&gt;{ -readonly [P in keyof T]-?: T[P] }&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="reasignación-de-claves-ts-41"&gt;Reasignación de claves (TS 4.1+)
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;as&lt;/code&gt; clause para renombrar propiedades: &lt;code&gt;{ [P in keyof T as &lt;/code&gt;get${Capitalize&amp;lt;string &amp;amp; P&amp;gt;}&lt;code&gt;]: () =&amp;gt; T[P] }&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Uniones discriminadas en TypeScript: Patrón switch exhaustivo</title><link>https://takao.blog/es/web/typescript-discriminated-unions/</link><pubDate>Wed, 10 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-discriminated-unions/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-discriminated-unions-es.png" alt="Featured image of post Uniones discriminadas en TypeScript: Patrón switch exhaustivo" /&gt;&lt;p&gt;Las uniones discriminadas (tagged unions) son la forma principal de modelar datos que pueden ser una de varias variantes. Usan una propiedad literal común (discriminante) para diferenciar los miembros.&lt;/p&gt;
&lt;h2 id="sintaxis-básica"&gt;Sintaxis básica
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Shape&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;kind&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;circle&amp;#39;&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;radius&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;number&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;kind&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;square&amp;#39;&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;side&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;number&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;kind&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;triangle&amp;#39;&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;base&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;number&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;number&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="estrechamiento-narrowing"&gt;Estrechamiento (narrowing)
&lt;/h2&gt;&lt;p&gt;TypeScript reduce automáticamente el tipo basado en el discriminante. Usar &lt;code&gt;switch&lt;/code&gt; con discriminante para manejar cada variante con seguridad de tipos.&lt;/p&gt;
&lt;h2 id="exhaustividad"&gt;Exhaustividad
&lt;/h2&gt;&lt;p&gt;Combinar con &lt;code&gt;never&lt;/code&gt; para garantizar que todos los casos se manejan: &lt;code&gt;default: const _exhaustive: never = value;&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Template Literal Types en TypeScript: Manipulación de tipos de cadenas</title><link>https://takao.blog/es/web/typescript-template-literal-types/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-template-literal-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-template-literal-types-es.png" alt="Featured image of post Template Literal Types en TypeScript: Manipulación de tipos de cadenas" /&gt;&lt;p&gt;Los Template Literal Types (TS 4.1+) permiten manipular tipos de cadenas en tiempo de compilación. Usan la misma sintaxis que los template literals de JavaScript pero con tipos.&lt;/p&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EventName&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`on&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Capitalize&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// &amp;#39;onChange&amp;#39; | &amp;#39;onClick&amp;#39; | &amp;#39;onSubmit&amp;#39; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tipos-de-manipulación-de-cadenas"&gt;Tipos de manipulación de cadenas
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Uppercase&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Lowercase&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Capitalize&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Uncapitalize&amp;lt;T&amp;gt;&lt;/code&gt;. Combinables para crear patrones de nomenclatura.&lt;/p&gt;
&lt;h2 id="inferencia-en-template-literals"&gt;Inferencia en template literals
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ExtractRoute&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`/api/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;infer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;R&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;R&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;never&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;R&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ExtractRoute&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;/api/users&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// &amp;#39;users&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="casos-de-uso-avanzados"&gt;Casos de uso avanzados
&lt;/h2&gt;&lt;p&gt;Mapeo evento-manejador, tipado de rutas de API, traducciones tipadas, CSS-in-JS con props de tema, generación de tipos a partir de recursos.&lt;/p&gt;</description></item><item><title>El operador satisfies en TypeScript: Tipado flexible y seguro</title><link>https://takao.blog/es/web/typescript-satisfies-operator/</link><pubDate>Mon, 10 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-satisfies-operator/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-satisfies-operator-es.png" alt="Featured image of post El operador satisfies en TypeScript: Tipado flexible y seguro" /&gt;&lt;p&gt;El operador &lt;code&gt;satisfies&lt;/code&gt; (TS 4.9+) verifica que una expresión cumple un tipo sin cambiar su tipo inferido. Permite tipado estricto en valores complejos como records y tuplas.&lt;/p&gt;
&lt;h2 id="el-problema"&gt;El problema
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;const x: Record&amp;lt;string, number&amp;gt; = { a: 1, b: 2 }&lt;/code&gt; pierde las claves específicas al acceder. Sin anotación, el tipo es demasiado amplio.&lt;/p&gt;
&lt;h2 id="solución-con-satisfies"&gt;Solución con satisfies
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;palette&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;red&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;green&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#00ff00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#a6e22e"&gt;satisfies&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;string&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;[]&lt;/span&gt;&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El tipo inferido conserva las propiedades específicas, pero se valida contra el constraint.&lt;/p&gt;</description></item><item><title>Patrones a evitar con async/await en JavaScript</title><link>https://takao.blog/es/web/javascript-async-await-tips/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/javascript-async-await-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/javascript-async-await-tips-es.png" alt="Featured image of post Patrones a evitar con async/await en JavaScript" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt; hizo la programación asíncrona más intuitiva, pero puede ocultar problemas de rendimiento y errores.&lt;/p&gt;
&lt;h2 id="antipatrón-1-serialización-innecesaria"&gt;Antipatrón 1: Serialización innecesaria
&lt;/h2&gt;&lt;p&gt;No uses &lt;code&gt;await&lt;/code&gt; secuencial para tareas independientes. Usa &lt;code&gt;Promise.all&lt;/code&gt; para ejecución en paralelo.&lt;/p&gt;
&lt;h2 id="antipatrón-2-bloques-try-catch-anidados"&gt;Antipatrón 2: Bloques try-catch anidados
&lt;/h2&gt;&lt;p&gt;El anidamiento profundo derrota el propósito de async/await. Usa un solo bloque try-catch al más alto nivel.&lt;/p&gt;
&lt;h2 id="antipatrón-3-async-callbacks-en-foreach"&gt;Antipatrón 3: async callbacks en forEach
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;forEach&lt;/code&gt; con async callback ejecuta los callbacks síncronamente. Usa &lt;code&gt;for...of&lt;/code&gt; para secuencial o &lt;code&gt;Promise.all&lt;/code&gt; con &lt;code&gt;map&lt;/code&gt; para paralelo.&lt;/p&gt;</description></item><item><title>Restricciones genéricas en TypeScript: Construyendo APIs type-safe</title><link>https://takao.blog/es/web/typescript-generic-constraints/</link><pubDate>Tue, 05 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-generic-constraints/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-generic-constraints-es.png" alt="Featured image of post Restricciones genéricas en TypeScript: Construyendo APIs type-safe" /&gt;&lt;p&gt;Los genéricos permiten código reutilizable type-safe. La palabra clave &lt;code&gt;extends&lt;/code&gt; restringe parámetros de tipo a formas con propiedades específicas.&lt;/p&gt;
&lt;h2 id="la-restricción-extends"&gt;La restricción extends
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;function getProperty&amp;lt;T, K extends keyof T&amp;gt;(obj: T, key: K): T[K]&lt;/code&gt; garantiza que &lt;code&gt;key&lt;/code&gt; sea una propiedad válida de &lt;code&gt;obj&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="conditional-types"&gt;Conditional Types
&lt;/h2&gt;&lt;p&gt;Usan &lt;code&gt;extends&lt;/code&gt; para verificar relaciones de tipo: &lt;code&gt;type IsString&amp;lt;T&amp;gt; = T extends string ? true : false;&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="mapped-types-con-keyof"&gt;Mapped Types con keyof
&lt;/h2&gt;&lt;p&gt;Transforman cada propiedad de un tipo existente. &lt;code&gt;Partial&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Required&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Readonly&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Pick&amp;lt;T, K&amp;gt;&lt;/code&gt;. Desde TS 4.1, remapeo de claves con template literal types.&lt;/p&gt;</description></item><item><title>Utility Types de TypeScript: Tu caja de herramientas de tipos</title><link>https://takao.blog/es/web/typescript-utility-types/</link><pubDate>Sun, 10 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/typescript-utility-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-utility-types-es.png" alt="Featured image of post Utility Types de TypeScript: Tu caja de herramientas de tipos" /&gt;&lt;p&gt;TypeScript incluye utility types globales para transformaciones comunes de tipos. Conocerlos evita reinventar la rueda y hace el código más legible.&lt;/p&gt;
&lt;h2 id="básicos"&gt;Básicos
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Partial&amp;lt;T&amp;gt;&lt;/code&gt;: todas las propiedades opcionales. &lt;code&gt;Required&amp;lt;T&amp;gt;&lt;/code&gt;: todas obligatorias. &lt;code&gt;Readonly&amp;lt;T&amp;gt;&lt;/code&gt;: todas de solo lectura. &lt;code&gt;Record&amp;lt;K, V&amp;gt;&lt;/code&gt;: objeto con claves K y valores V.&lt;/p&gt;
&lt;h2 id="para-unión-e-intersección"&gt;Para unión e intersección
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Pick&amp;lt;T, K&amp;gt;&lt;/code&gt;: seleccionar propiedades. &lt;code&gt;Omit&amp;lt;T, K&amp;gt;&lt;/code&gt;: excluir propiedades. &lt;code&gt;Extract&amp;lt;T, U&amp;gt;&lt;/code&gt;: extraer miembros de unión. &lt;code&gt;Exclude&amp;lt;T, U&amp;gt;&lt;/code&gt;: excluir miembros de unión.&lt;/p&gt;
&lt;h2 id="para-funciones"&gt;Para funciones
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Parameters&amp;lt;T&amp;gt;&lt;/code&gt;: tipos de parámetros. &lt;code&gt;ReturnType&amp;lt;T&amp;gt;&lt;/code&gt;: tipo de retorno. &lt;code&gt;ConstructorParameters&amp;lt;T&amp;gt;&lt;/code&gt;: parámetros de constructor. &lt;code&gt;InstanceType&amp;lt;T&amp;gt;&lt;/code&gt;: tipo de instancia.&lt;/p&gt;</description></item></channel></rss>