JavaScript es tipado débil

En esta clase aterrizamos una idea clave para evitar bugs tontos: JavaScript es de tipado débil.

Esto no es “JavaScript es malo”, es “JavaScript toma decisiones por ti”. Y a veces, esas decisiones son… creativas.

La razón principal: hace conversiones implícitas (type coercion).

Tipado débil vs tipado fuerte

  • Tipado débil: el lenguaje intenta “arreglar” tipos por su cuenta para que la operación siga adelante.
  • Tipado fuerte: el lenguaje es más estricto y no te deja mezclar tipos a la ligera.

En JavaScript, muchas veces, en vez de fallar, convierte.

El típico ejemplo de conversión implícita

Imagina que tienes una función que espera un número, pero le pasas un string:

function doble(n) {
  return n * 2
}

doble("21") // 42 (sí, te lo convierte)

JavaScript se lo “come con patatas” y lo transforma automáticamente.

Ese es el corazón del tipado débil: no te obliga a tener el tipo correcto, intenta adaptarse.

Entonces, ¿TypeScript “endurece” JavaScript?

No.

TypeScript no cambia el comportamiento de JavaScript en runtime. Si en JavaScript "21" * 2 funciona, seguirá funcionando.

Lo que hace TypeScript es avisarte antes:

  • El editor te marca el problema
  • El compilador te lo canta
  • Tú lo arreglas antes de que llegue a producción

Ejemplo:

function doble(n: number) {
  return n * 2
}

doble("21") // Error de tipos: aquí está el valor real de TS

TypeScript no evita la conversión en JavaScript, pero te ayuda a no depender de ella.

Por qué esto importa en una API

En backend (Express, Node.js), muchísimas cosas vienen como string:

  • req.query
  • req.params
  • Datos de formularios

Si asumes números sin validar, te puedes comer:

  • Cálculos raros
  • Comparaciones inconsistentes
  • Bugs que aparecen “solo a veces”

Buenas prácticas para no vivir al límite

Convierte de forma explícita cuando lo necesites:

const page = Number(req.query.page)

Valida lo que entra (no confíes en el cliente).

Evita comparaciones “mágicas”:

0 == "0"   // true  (coerción)
0 === "0"  // false (sin coerción)

Si puedes, apóyate en TypeScript para que el propio código te frene.

Idea clave para quedarte

  • JavaScript es tipado débil porque hace conversiones implícitas.
  • TypeScript no cambia JavaScript, pero sí hace que sea mucho más difícil que te la cuelen.