Solución: TypeError — X is not a function en JavaScript
JavaScript lanza 'is not a function' cuando intentas llamar como función algo que no lo es. Las causas más frecuentes y cómo depurarlo rápido.
¿Por qué ocurre?
Estás usando el operador () para llamar a algo que no es una función en ese momento: puede ser undefined, null, un número, un objeto o una función que se sobreescribió accidentalmente. También ocurre por shadowing de nombres (una variable local tapa una función del mismo nombre) o por importar incorrectamente un módulo.
Solución paso a paso
Paso 1 — Comprueba qué es realmente esa variable:
console.log(typeof miVariable); // Si no es "function", ese es el problema
console.log(miVariable); // Ver el valor exacto
Caso más común — llamar a un método que no existe en ese tipo:
// ❌ .map() no existe en objetos
const datos = { a: 1, b: 2 };
datos.map(x => x); // TypeError: datos.map is not a function// ✅ Convierte a array primero
Object.values(datos).map(x => x);
// ❌ .toUpperCase() solo existe en strings
const num = 42;
num.toUpperCase(); // TypeError
// ✅ Convierte antes
String(num).toUpperCase();
Caso — importación incorrecta de función:
// Si el módulo exporta un objeto con la función:
// módulo.js → export default { miFuncion: () => {} }// ❌ Importas el objeto pero lo llamas directamente
import miFuncion from './modulo';
miFuncion(); // TypeError — es un objeto, no una función
// ✅ Desestructura correctamente
import { miFuncion } from './modulo';
miFuncion();
Caso — callback no llegó como función:
// ❌ Si onSubmit es undefined porque no se pasó como prop
function Formulario({ onSubmit }) {
return ;
// TypeError si el padre no pasó onSubmit
}// ✅ Comprueba antes de llamar
function Formulario({ onSubmit }) {
const handleClick = () => {
if (typeof onSubmit === 'function') onSubmit(datos);
};
return ;
}
Caso — shadowing de nombre:
// ❌ La variable local tapa la función global
function procesarDatos() {
const parseInt = 42; // ← tapa window.parseInt
return parseInt('10'); // TypeError: parseInt is not a function
}
Cómo evitarlo en el futuro
Usa TypeScript o JSDoc para que el editor avise antes de que explote en runtime. Cuando una función recibe callbacks, valida con `typeof cb === 'function'` antes de llamarlos. Evita nombres de variables que coincidan con funciones nativas (parseInt, fetch, map...).
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts