Inicio » [SOLUCIONADO] Error TypeScript TS2339: Property does not exist on type
Web y Código

[SOLUCIONADO] Error TypeScript TS2339: Property does not exist on type

Uno de los errores más comunes y frustrantes al compilar código con TypeScript es error TS2339: Property '...' does not exist on type '...'. El comprobador de tipos estático detecta que estás intentando acceder a una propiedad que no fue declarada explícitamente en la interfaz o tipo del objeto, deteniendo la compilación.

El Diagnóstico Rápido

Causa
Acceso a propiedades dinámicas en objetos tipados estrictamente sin firmas de índice
Solución
Definir una interfaz con tipos opcionales o usar firmas de índice [key: string]: any
Causa
Añadir variables globales al objeto window sin extender la interfaz global de Window
Solución
Declarar la propiedad en un archivo global.d.ts extendiendo interface Window

La Solución Paso a Paso

  1. 1

    Paso 1: Tipar interfaces con propiedades opcionales o índice dinámico

    Si recibes un objeto de una API con campos variables, declara una interfaz adecuada:

    TYPESCRIPT
    // En lugar de un tipo cerrado
    interface Usuario {
      id: number;
      nombre: string;
      // Propiedad opcional
      avatar?: string;
      // Permite propiedades dinámicas adicionales
      [key: string]: unknown;
    }
    
    const u: Usuario = { id: 1, nombre: "Elena", rol: "Admin" };
    console.log(u.rol); // Compila perfectamente sin error TS2339
    
  2. 2

    Paso 2: Extender el objeto global window en TypeScript

    Si utilizas librerías externas o scripts de analítica (Google Analytics, Stripe, PayPal) que agregan variables a window:

    TYPESCRIPT
    // Crea o edita el archivo types/global.d.ts
    export {};
    
    declare global {
      interface Window {
        dataLayer?: Record<string, unknown>[];
        MiVariableGlobal?: string;
      }
    }
    

    Asegúrate de que types/global.d.ts esté incluido en la matriz include de tu archivo tsconfig.json.

  3. 3

    Paso 3: Resolver el error en eventos de React (HTMLInputElement)

    Al manejar eventos de formulario en React, el error TS2339 aparece al intentar leer e.target.value en eventos genéricos:

    TYPESCRIPT
    // Incorrecto: e: React.SyntheticEvent
    // Correcto: especificar el elemento HTML exacto
    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
      console.log(e.target.value); // TS reconoce 'value' sin errores
    };
    

Preguntas Frecuentes

¿Por qué no debo usar "as any" para resolver TS2339?

Porque anula la verificación estática de TypeScript para esa variable, impidiendo que el autocompletado y el compilador te avisen si la propiedad cambia de nombre o se borra en el futuro.

¿Cómo compruebo si una propiedad existe en runtime de forma segura?

Utiliza el operador in: if ("propiedad" in objeto) { console.log(objeto.propiedad); }. TypeScript reducirá automáticamente el tipo dentro del bloque condicional.

Consejo de Prevención

Prácticas de seguridad recomendadas:

  • Evita recurrir a as any para silenciar el error; debilita toda la seguridad de tipos de tu aplicación.
  • Utiliza guardas de tipo (if ('prop' in obj)) antes de acceder a propiedades en tipos de unión.
Autor • Diseñador Web & Creador de Apps

Rodolfo Castro

Diseñador web, creador de aplicaciones y fundador de SoporteCero. Especialista en desarrollo de productos digitales, interfaz de usuario y arquitectura web (Pixel Digital Dz). Cada tutorial y solución de SoporteCero es reproducido y verificado en laboratorio técnico para ofrecer guías funcionales y actualizadas.