TypeScript y Python son lenguajes de alto nivel con recolección de basura, funciones de primera clase y grandes ecosistemas de paquetes. La diferencia principal es el tipado: el compilador de TypeScript comprueba los tipos antes de que el programa se ejecute, y los type hints de Python son anotaciones opcionales que el intérprete ignora. Además se ejecutan en motores distintos y dominan tipos de software distintos: TypeScript la web, Python el trabajo con datos y el scripting.
Aquí tienes un programa pequeño en TypeScript. Pulsa Run:
Salida:
162.25
[ 'Ada', 'Grace', 'Linus' ]
El mismo programa en Python, con type hints:
from dataclasses import dataclass
@dataclass
class Order:
customer: str
amount: float
paid: bool
def total_paid(orders: list[Order]) -> float:
return sum(o.amount for o in orders if o.paid)
orders = [
Order("Ada", 120.0, True),
Order("Grace", 80.5, False),
Order("Linus", 42.25, True),
]
by_amount = [o.customer for o in sorted(orders, key=lambda o: o.amount, reverse=True)]
print(total_paid(orders))
print(by_amount)
162.25
['Ada', 'Grace', 'Linus']
La estructura es parecida: un tipo para el registro, una función con parámetros tipados y una lista de valores. Las diferencias visibles son la sintaxis (llaves y punto y coma frente a indentación), interface frente a un @dataclass, y funciones flecha con filter/reduce frente a una expresión generadora.
TypeScript vs Python de un vistazo
| TypeScript | Python | |
|---|---|---|
| Tipado | Estático, comprobado en compilación; los tipos se borran en ejecución | Dinámico; type hints opcionales que no se hacen cumplir en ejecución |
| Comprobador de tipos | tsc, parte del lenguaje | Herramientas aparte: mypy, pyright y otras |
| Se ejecuta en | Motores JavaScript: navegadores, Node.js, Deno, Bun | CPython (el intérprete estándar), PyPy y otros |
| Ejecución | Se compila a JavaScript y el motor lo compila JIT | Bytecode interpretado en CPython |
| Bloques | Llaves { } | Indentación |
| Números | number (float de 64 bits) y bigint | int (de cualquier tamaño) y float |
| Concurrencia | Un hilo por event loop, async/await; workers para trabajo en paralelo | asyncio, hilos, multiprocessing |
| Gestor de paquetes | npm, pnpm, Yarn, Bun | pip, uv, Poetry |
| Donde más destaca | Front end web, back end con Node.js, aplicaciones full stack | Ciencia de datos, machine learning, scripting, automatización, back end |
Sintaxis lado a lado
Si conoces los type hints de Python, la mayoría de las anotaciones de TypeScript tienen un equivalente directo:
| Python | TypeScript |
|---|---|
count: int = 0 | let count: number = 0; |
def add(a: int, b: int) -> int: | function add(a: number, b: number): number { |
lambda x: x * 2 | (x) => x * 2 |
list[str] | string[] |
dict[str, int] | Record<string, number> o Map<string, number> |
tuple[int, str] | [number, string] |
str | None | string | null o string | undefined |
Literal["asc", "desc"] | "asc" | "desc" |
Callable[[int], str] | (n: number) => string |
TypedDict | interface o type |
@dataclass | una class, o una interface para datos simples |
Any | any |
None, True, False | null (o undefined), true, false |
and, or, not | &&, ||, ! |
f"Hello {name}" | `Hello ${name}` |
Tipos estáticos frente a type hints
Los dos lenguajes te dejan escribir la misma anotación, a: number o a: int. Lo que pasa después es distinto.
En TypeScript, el compilador comprueba cada llamada antes de que se ejecute nada. Un argumento incorrecto detiene la compilación:
index.ts(7,17): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
En Python, los hints son metadatos. El intérprete ejecuta la llamada y devuelve un string:
def add(a: int, b: int) -> int:
return a + b
print(add(2, 3)) # 5
print(add("2", "3")) # 23, the hints are not enforced
La comprobación es un paso aparte con una herramienta como mypy:
$ mypy hints.py
hints.py:6: error: Argument 1 to "add" has incompatible type "str"; expected "int" [arg-type]
hints.py:6: error: Argument 2 to "add" has incompatible type "str"; expected "int" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
Así que el tipado de Python es gradual por diseño: el código sin anotaciones simplemente no se comprueba, y añades hints donde ayudan. TypeScript también puede ser permisivo (any desactiva la comprobación de un valor), pero con strict activado, que es lo habitual por defecto, un parámetro sin anotar es un error y no un pase libre.
Una cosa tienen en común: ninguno comprueba tipos mientras el programa se ejecuta. TypeScript borra sus tipos y Python ignora sus hints. Los datos que llegan en ejecución, como el JSON de una API, necesitan validación en los dos lenguajes (librerías como Zod en TypeScript y Pydantic en Python lo hacen a partir de un esquema).
Los números se comportan distinto
TypeScript tiene los números de JavaScript: number es un valor en coma flotante de 64 bits tanto para enteros como para decimales, y bigint es un tipo aparte para enteros grandes. El int de Python crece hasta cualquier tamaño por sí solo.
Salida:
0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n
Python imprime 9007199254740993 para 2**53 + 1, porque sus enteros son exactos a cualquier tamaño, y tiene un operador propio de división entera, 7 // 2, que da 3. En TypeScript no existe un tipo int; un entero es un number que no tiene parte decimal.
Entorno de ejecución y rendimiento
TypeScript se ejecuta como JavaScript. V8 (en Chrome y Node.js), JavaScriptCore (en Safari y Bun) y SpiderMonkey (en Firefox) compilan a código máquina el código que más se ejecuta mientras corre, así que los bucles intensivos en TypeScript suelen ser mucho más rápidos que los mismos bucles en CPython, que ejecuta bytecode.
Esa diferencia importa menos de lo que parece en muchos programas:
- Las librerías numéricas y de machine learning de Python (NumPy, pandas, PyTorch) hacen el trabajo pesado en código compilado en C, C++ o CUDA, así que un programa Python que las llama no ejecuta sus bucles internos en Python.
- Los servidores web en cualquiera de los dos lenguajes pasan gran parte del tiempo esperando a bases de datos y a la red.
Los dos lenguajes usan un hilo principal para la mayor parte del código. TypeScript en Node.js gestiona la concurrencia con un event loop y async/await, y usa worker threads para el trabajo de CPU en paralelo. Python tiene asyncio para el mismo estilo de concurrencia, además de hilos y procesos.
Ecosistemas y casos de uso
TypeScript es la opción por defecto para:
- El front end web: React, Angular, Vue y Svelte lo soportan, y se compila al JavaScript que ejecutan los navegadores.
- Código de servidor en Node.js, Deno y Bun: APIs con Express, Fastify, NestJS o Hono.
- Aplicaciones full stack en las que el servidor y el navegador comparten definiciones de tipos, como los proyectos Next.js.
- Herramientas, aplicaciones de línea de comandos y aplicaciones de escritorio con Electron.
Python es la opción por defecto para:
- Análisis y visualización de datos (pandas, NumPy, Matplotlib, notebooks de Jupyter).
- Machine learning e IA (PyTorch, scikit-learn y la mayor parte del código de entrenamiento de modelos).
- Scripting y automatización: procesar archivos, administración de sistemas, código de pegamento.
- Back end web con Django, Flask o FastAPI.
- Computación científica y enseñanza.
El back end web es donde más se solapan. Los equipos suelen elegir según el resto del stack: TypeScript para compartir código con un front end en TypeScript, Python para estar junto al código de datos y de ML.
¿Cuál deberías aprender?
- ¿Vas a construir para la web? Aprende JavaScript y luego TypeScript. Todo lo que se ejecuta en un navegador acaba siendo JavaScript, y TypeScript es como se escribe la mayor parte del código front end profesional.
- ¿Trabajas con datos, IA o automatización? Aprende Python. Sus librerías en esas áreas no tienen un equivalente real en el mundo JavaScript.
- ¿Primer lenguaje, sin un objetivo concreto? Python tiene menos sintaxis que aprender antes de poder escribir programas útiles. TypeScript añade un sistema de tipos encima de JavaScript, que al principio es algo más que aprender y compensa a medida que los programas crecen.
Muchos desarrolladores usan los dos: Python para datos y scripts, TypeScript para el código web del producto. Si ya conoces los type hints de Python, las anotaciones de TypeScript te resultarán familiares; lo nuevo es que el compilador las hace cumplir por defecto y que el entorno de ejecución que hay debajo es JavaScript.
Preguntas frecuentes
¿Es TypeScript mejor que Python?
Ninguno es mejor en general; cada uno domina en áreas distintas. TypeScript es la opción estándar para el front end web y habitual en servidores Node.js, y su comprobación de tipos forma parte del flujo de trabajo normal. Python domina en ciencia de datos, machine learning, scripting y automatización, y tiene type hints que puedes comprobar con herramientas como mypy o pyright.
¿Es TypeScript más rápido que Python?
Para código que depende de la CPU escrito en el propio lenguaje, normalmente sí: TypeScript se compila a JavaScript, que motores como V8 compilan a código máquina durante la ejecución, mientras que el intérprete estándar de Python, CPython, ejecuta bytecode. Los programas Python que pasan el tiempo en librerías escritas en C (NumPy, pandas, PyTorch) no tienen ese límite, y en servidores que esperan sobre todo a la red la diferencia suele ser pequeña.
¿Python tiene tipado estático como TypeScript?
Python tiene type hints opcionales (def add(a: int, b: int) -> int), pero el intérprete no los hace cumplir: add("2", "3") se ejecuta y devuelve "23". Un comprobador aparte, como mypy o pyright, informa del error. En TypeScript, comprobar tipos es la tarea principal del compilador, y los proyectos se configuran normalmente para que el código con errores de tipos no compile.
¿Debo aprender primero TypeScript o Python?
Elige según lo que quieras construir. Para webs y aplicaciones web, aprende JavaScript y luego TypeScript, porque los navegadores solo ejecutan JavaScript. Para análisis de datos, machine learning, automatización o un primer lenguaje con muy poca sintaxis, empieza por Python. Las ideas básicas (variables, funciones, bucles, objetos) sirven en los dos casos.