<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jacob Palomo</title>
    <description>The latest articles on DEV Community by Jacob Palomo (@jacobnpalomo).</description>
    <link>https://dev.to/jacobnpalomo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F881825%2Fbb69d1fe-8971-4c90-9197-acf289ec32e1.JPG</url>
      <title>DEV Community: Jacob Palomo</title>
      <link>https://dev.to/jacobnpalomo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacobnpalomo"/>
    <language>en</language>
    <item>
      <title>Detén la erosión de tipos: Construí Any-Hunter, un auditor de salud de tipos para TypeScript 🎯</title>
      <dc:creator>Jacob Palomo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/jacobnpalomo/deten-la-erosion-de-tipos-construi-any-hunter-un-auditor-de-salud-de-tipos-para-typescript-1bj2</link>
      <guid>https://dev.to/jacobnpalomo/deten-la-erosion-de-tipos-construi-any-hunter-un-auditor-de-salud-de-tipos-para-typescript-1bj2</guid>
      <description>&lt;p&gt;Casi todos los desarrolladores de TypeScript han vivido esta historia: inicias un repositorio con &lt;code&gt;strict: true&lt;/code&gt; y tipado riguroso. Meses después, por prisas de entrega o librerías externas sin tipos, el código comienza a llenarse de &lt;code&gt;as any&lt;/code&gt;, &lt;code&gt;@ts-ignore&lt;/code&gt;, operadores &lt;code&gt;!&lt;/code&gt; y llamadas a &lt;code&gt;JSON.parse&lt;/code&gt; sin validar.&lt;/p&gt;

&lt;p&gt;El proyecto compila sin errores, pero la seguridad en tiempo de ejecución se degrada. Este fenómeno se conoce como &lt;strong&gt;erosión de tipos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para solucionar esto construí &lt;strong&gt;Any-Hunter&lt;/strong&gt; — una herramienta CLI, API programática y GitHub Action con cero dependencias que audita tu repositorio y calcula un &lt;strong&gt;Type-Health Score (0–100)&lt;/strong&gt; en tiempo real.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 ¿En qué se diferencia de un linter tradicional?
&lt;/h2&gt;

&lt;p&gt;Mientras que herramientas como ESLint reportan listas de errores de sintaxis, Any-Hunter evalúa la salud de tipos como una métrica de calidad:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Métrica Cuantificable:&lt;/strong&gt; Proporciona un puntaje claro (ej: &lt;code&gt;Score: 89/100&lt;/code&gt;) para establecer compuertas de calidad (&lt;em&gt;quality gates&lt;/em&gt;) mínimas en CI/CD (&lt;code&gt;--threshold=85&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditoría Semántica con TypeChecker:&lt;/strong&gt; Utiliza el motor del compilador de TypeScript para cazar el &lt;strong&gt;"Any Invisible"&lt;/strong&gt; (variables que heredan &lt;code&gt;any&lt;/code&gt; implícitamente de APIs externas o &lt;code&gt;JSON.parse&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severidad Ponderada:&lt;/strong&gt; Un &lt;code&gt;any&lt;/code&gt; en una variable local resta 2 puntos, pero un parámetro envenenado (&lt;code&gt;fn(data: any)&lt;/code&gt;) o una fuga de retorno penalizan con 5 puntos debido a la contaminación del resto del scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte Nativo SARIF y GitHub:&lt;/strong&gt; Genera reportes visuales en los Step Summaries de GitHub Actions y archivos SARIF estándar para la pestaña &lt;em&gt;Security &amp;gt; Code scanning&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ⚡ Uso Rápido
&lt;/h2&gt;

&lt;p&gt;Genera el archivo de configuración base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx any-hunter &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Audita tu proyecto localmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx any-hunter ./tsconfig.json &lt;span class="nt"&gt;--threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Cacería Profunda en el AST
&lt;/h2&gt;

&lt;p&gt;Any-Hunter inspecciona directamente el Árbol de Sintaxis Abstracta (AST) de TypeScript para atrapar patrones críticos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parámetros envenenados:&lt;/strong&gt; &lt;code&gt;function handleData(input: any)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fugas de retorno:&lt;/strong&gt; &lt;code&gt;const fetchRecord = (): any =&amp;gt; { ... }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Genéricos camuflados:&lt;/strong&gt; &lt;code&gt;Promise&amp;lt;any&amp;gt;&lt;/code&gt;, &lt;code&gt;Array&amp;lt;any&amp;gt;&lt;/code&gt;, &lt;code&gt;Record&amp;lt;string, any&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supresiones de compilador:&lt;/strong&gt; &lt;code&gt;// @ts-ignore&lt;/code&gt; o &lt;code&gt;// @ts-nocheck&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si un caso específico requiere omitir la verificación de forma justificada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// any-hunter-disable-next-line&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤖 Integración en CI/CD (GitHub Actions)
&lt;/h2&gt;

&lt;p&gt;Puedes ejecutar Any-Hunter automáticamente en cada Pull Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Control de Calidad de Tipos&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;audit-types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;JacobPalomo/any-hunter@v1.1.2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;85&lt;/span&gt;
          &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/*.test.ts'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤝 Proyecto Open Source
&lt;/h2&gt;

&lt;p&gt;Any-Hunter es 100% código abierto bajo licencia MIT.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐️ &lt;strong&gt;Repositorio en GitHub:&lt;/strong&gt; &lt;a href="https://github.com/JacobPalomo/any-hunter" rel="noopener noreferrer"&gt;https://github.com/JacobPalomo/any-hunter&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¡Cualquier comentario, caso de prueba o sugerencia para nuevas reglas es más que bienvenido!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>spanish</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Stop Type Erosion: Building a Zero-Dependency Type-Health Auditor for TypeScript 🎯</title>
      <dc:creator>Jacob Palomo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/jacobnpalomo/stop-type-erosion-building-a-zero-dependency-type-health-auditor-for-typescript-5hb8</link>
      <guid>https://dev.to/jacobnpalomo/stop-type-erosion-building-a-zero-dependency-type-health-auditor-for-typescript-5hb8</guid>
      <description>&lt;p&gt;We've all seen this lifecycle: a project starts with &lt;code&gt;strict: true&lt;/code&gt;, pristine interfaces, and zero type bypasses. Six months later, under feature delivery pressure, workarounds like &lt;code&gt;as any&lt;/code&gt;, &lt;code&gt;@ts-ignore&lt;/code&gt;, non-null assertions (&lt;code&gt;!&lt;/code&gt;), and unvalidated &lt;code&gt;JSON.parse&lt;/code&gt; calls start creeping in.&lt;/p&gt;

&lt;p&gt;The code still compiles, but runtime reliability plummets. This pattern is known as &lt;strong&gt;Type Erosion&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To solve this, I built &lt;strong&gt;Any-Hunter&lt;/strong&gt; — a zero-dependency CLI, programmatic library, and GitHub Action that audits your codebase and computes a &lt;strong&gt;Type-Health Score (0–100)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Why Not Just ESLint?
&lt;/h2&gt;

&lt;p&gt;Standard linters inspect static syntax, but Any-Hunter approaches typing from an architectural health perspective:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A Measurable Health Metric:&lt;/strong&gt; Instead of an endless log of warnings, you get a concrete score (e.g., &lt;code&gt;Type-Health: 91/100&lt;/code&gt;) that management and teams can track over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Compiler Analysis:&lt;/strong&gt; Uses TypeScript's &lt;code&gt;TypeChecker&lt;/code&gt; to catch &lt;strong&gt;Invisible &lt;code&gt;any&lt;/code&gt;s&lt;/strong&gt; (variables implicitly inheriting &lt;code&gt;any&lt;/code&gt; from untyped APIs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope-Aware Severity:&lt;/strong&gt; A local variable with &lt;code&gt;any&lt;/code&gt; is a warning (-2 pts), but a function parameter typed as &lt;code&gt;any&lt;/code&gt; poisons the entire execution scope and triggers an error (-5 pts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native SARIF &amp;amp; CI Reports:&lt;/strong&gt; Outputs GitHub Step Summaries and standard OASIS SARIF files for GitHub Code Scanning without third-party plugins.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ⚡ Quick Start
&lt;/h2&gt;

&lt;p&gt;Generate a &lt;code&gt;.anyhunterrc.json&lt;/code&gt; configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx any-hunter &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run an audit against your &lt;code&gt;tsconfig.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx any-hunter ./tsconfig.json &lt;span class="nt"&gt;--threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Behind the Scenes: Deep AST Inspection
&lt;/h2&gt;

&lt;p&gt;Any-Hunter traverses the Abstract Syntax Tree (AST) using TypeScript's Compiler API to detect patterns such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Poisoned Parameters:&lt;/strong&gt; &lt;code&gt;function processData(payload: any)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaky Returns:&lt;/strong&gt; &lt;code&gt;const getUser = (): any =&amp;gt; { ... }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disguised Generics:&lt;/strong&gt; &lt;code&gt;Promise&amp;lt;any&amp;gt;&lt;/code&gt;, &lt;code&gt;Array&amp;lt;any&amp;gt;&lt;/code&gt;, &lt;code&gt;Record&amp;lt;string, any&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compiler Bypasses:&lt;/strong&gt; &lt;code&gt;// @ts-ignore&lt;/code&gt; or &lt;code&gt;// @ts-nocheck&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When justifiable exceptions occur, developers can skip a line locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// any-hunter-disable-next-line&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤖 GitHub Actions Workflow
&lt;/h2&gt;

&lt;p&gt;Integrate Any-Hunter directly into your Pull Request pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Type Health Check&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;audit-types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;JacobPalomo/any-hunter@v1.1.2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;85&lt;/span&gt;
          &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/*.test.ts'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤝 Open Source
&lt;/h2&gt;

&lt;p&gt;Any-Hunter is 100% open source under the MIT License.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐️ &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/JacobPalomo/any-hunter" rel="noopener noreferrer"&gt;https://github.com/JacobPalomo/any-hunter&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know in the comments what custom rules or frameworks you would like to see supported next!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
