Menu

TypeScript vs Python : typage, performances et usages comparés

TypeScript et Python sont deux langages de haut niveau avec ramasse-miettes, mais TypeScript vérifie ses types avant l'exécution alors que les type hints de Python sont facultatifs et ignorés à l'exécution. Une comparaison côte à côte du typage, de l'exécution, de la vitesse, des écosystèmes et des usages, avec le même programme dans les deux langages.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

TypeScript et Python sont deux langages de haut niveau avec ramasse-miettes, fonctions de première classe et vastes écosystèmes de paquets. La principale différence tient au typage : les types de TypeScript sont vérifiés par le compilateur avant l'exécution du programme, et les type hints de Python sont des annotations facultatives que l'interpréteur ignore. Ils tournent aussi sur des moteurs différents et dominent des types de logiciels différents : TypeScript le web, Python le travail sur les données et les scripts.

Voici un petit programme en TypeScript. Cliquez sur Run :

Sortie :

162.25
[ 'Ada', 'Grace', 'Linus' ]

Le même programme en Python, avec des 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 structure est proche : un type pour l'enregistrement, une fonction aux paramètres typés, une liste de valeurs. Les différences visibles sont la syntaxe (accolades et points-virgules contre indentation), interface contre un @dataclass, et les fonctions fléchées avec filter/reduce contre une expression génératrice.

TypeScript vs Python en un coup d'œil

TypeScriptPython
TypageStatique, vérifié à la compilation ; types effacés à l'exécutionDynamique ; type hints facultatifs, non imposés à l'exécution
Vérificateur de typestsc, qui fait partie du langageDes outils séparés : mypy, pyright et d'autres
Tourne surDes moteurs JavaScript : navigateurs, Node.js, Deno, BunCPython (l'interpréteur standard), PyPy et d'autres
ExécutionCompilé en JavaScript, puis compilé à la volée (JIT) par le moteurBytecode interprété dans CPython
BlocsAccolades { }Indentation
Nombresnumber (flottant 64 bits) et bigintint (taille quelconque) et float
ConcurrenceUn thread par boucle d'événements, async/await ; des workers pour le travail parallèleasyncio, threads, multiprocessing
Gestionnaire de paquetsnpm, pnpm, Yarn, Bunpip, uv, Poetry
Point fortFrontend web, backend Node.js, applications full stackData science, machine learning, scripts, automatisation, backend

La syntaxe côte à côte

Si vous connaissez les type hints de Python, la plupart des annotations TypeScript ont un équivalent direct :

PythonTypeScript
count: int = 0let 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> ou Map<string, number>
tuple[int, str][number, string]
str | Nonestring | null ou string | undefined
Literal["asc", "desc"]"asc" | "desc"
Callable[[int], str](n: number) => string
TypedDictinterface ou type
@dataclassune class, ou une interface pour des données simples
Anyany
None, True, Falsenull (ou undefined), true, false
and, or, not&&, ||, !
f"Hello {name}"`Hello ${name}`

Types statiques contre type hints

Les deux langages permettent d'écrire la même annotation, a: number ou a: int. C'est la suite qui diffère.

En TypeScript, le compilateur vérifie chaque appel avant que quoi que ce soit ne s'exécute. Un mauvais argument arrête le build :

index.ts(7,17): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

En Python, les hints sont des métadonnées. L'interpréteur exécute l'appel et renvoie une chaîne :

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 vérification est une étape séparée, avec un outil comme 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)

Le typage de Python est donc graduel par conception : le code non annoté n'est tout simplement pas vérifié, et vous ajoutez des hints là où ils aident. TypeScript peut aussi être permissif (any désactive la vérification pour une valeur), mais avec strict activé, ce qui est le cas par défaut, un paramètre non annoté est une erreur et non un laissez-passer.

Un point commun aux deux : aucun ne vérifie les types pendant l'exécution du programme. TypeScript efface ses types, et Python ignore ses hints. Les données qui arrivent à l'exécution, comme du JSON venu d'une API, doivent être validées dans les deux langages (des bibliothèques comme Zod en TypeScript et Pydantic en Python le font à partir d'un schéma).

Les nombres se comportent différemment

TypeScript a les nombres de JavaScript : number est une valeur à virgule flottante sur 64 bits, pour les entiers comme pour les décimaux, et bigint est un type distinct pour les grands entiers. Le int de Python grandit tout seul jusqu'à n'importe quelle taille.

Sortie :

0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n

Python affiche 9007199254740993 pour 2**53 + 1, puisque ses entiers sont exacts quelle que soit leur taille, et il a un opérateur de division entière dédié, 7 // 2, qui donne 3. Il n'y a pas de type int en TypeScript ; un entier est un number qui se trouve ne pas avoir de partie décimale.

Exécution et performances

TypeScript s'exécute sous forme de JavaScript. V8 (dans Chrome et Node.js), JavaScriptCore (dans Safari et Bun) et SpiderMonkey (dans Firefox) compilent le code le plus sollicité en code machine pendant l'exécution, si bien que les boucles serrées en TypeScript sont en général bien plus rapides que les mêmes boucles dans CPython, qui exécute du bytecode.

Cet écart compte moins qu'il n'y paraît pour beaucoup de programmes :

  • Les bibliothèques numériques et de machine learning de Python (NumPy, pandas, PyTorch) font leur gros travail en code compilé C, C++ ou CUDA : un programme Python qui les appelle n'exécute donc pas ses boucles internes en Python.
  • Les serveurs web, dans un langage comme dans l'autre, passent une grande partie de leur temps à attendre les bases de données et le réseau.

Les deux langages utilisent un seul thread principal pour la majeure partie du code. TypeScript sur Node.js gère la concurrence avec une boucle d'événements et async/await, et utilise des worker threads pour le travail CPU en parallèle. Python propose asyncio pour le même style de concurrence, plus les threads et les processus.

Écosystèmes et usages

TypeScript est le choix par défaut pour :

  • Le frontend web : React, Angular, Vue et Svelte le prennent tous en charge, et il se compile en JavaScript, que les navigateurs exécutent.
  • Le code serveur sur Node.js, Deno et Bun : des API avec Express, Fastify, NestJS ou Hono.
  • Les applications full stack où le serveur et le navigateur partagent des définitions de types, comme les projets Next.js.
  • L'outillage, les outils en ligne de commande et les applications de bureau avec Electron.

Python est le choix par défaut pour :

  • L'analyse et la visualisation de données (pandas, NumPy, Matplotlib, notebooks Jupyter).
  • Le machine learning et l'IA (PyTorch, scikit-learn, et la plupart du code d'entraînement de modèles).
  • Les scripts et l'automatisation : traitement de fichiers, administration système, code de liaison.
  • Le backend web avec Django, Flask ou FastAPI.
  • Le calcul scientifique et l'enseignement.

C'est le développement web backend qui les fait le plus se recouper. Les équipes choisissent souvent selon le reste de leur stack : TypeScript pour partager du code avec un frontend en TypeScript, Python pour rester proche du code data et ML.

Lequel apprendre ?

  • Vous développez pour le web ? Apprenez JavaScript, puis TypeScript. Tout ce qui tourne dans un navigateur finit en JavaScript, et TypeScript est la façon dont s'écrit la plupart du code frontend professionnel.
  • Vous travaillez sur les données, l'IA ou l'automatisation ? Apprenez Python. Ses bibliothèques dans ces domaines n'ont pas de véritable équivalent dans le monde JavaScript.
  • Premier langage, sans objectif précis ? Python demande moins de syntaxe avant de pouvoir écrire des programmes utiles. TypeScript ajoute un système de types par-dessus JavaScript, ce qui fait davantage à apprendre au début et devient rentable à mesure que les programmes grandissent.

Beaucoup de développeurs utilisent les deux : Python pour les données et les scripts, TypeScript pour le code web du produit. Si vous connaissez déjà les type hints de Python, les annotations de TypeScript vous sembleront familières ; la nouveauté, c'est que le compilateur les impose par défaut et que l'environnement d'exécution sous-jacent est JavaScript.

Questions fréquentes

TypeScript est-il meilleur que Python ?

Aucun des deux n'est meilleur dans l'absolu ; ils dominent des domaines différents. TypeScript est le choix standard pour le frontend web et courant pour les serveurs Node.js, et sa vérification des types fait partie du flux de travail normal. Python domine la data science, le machine learning, les scripts et l'automatisation, et propose des type hints que vous pouvez vérifier avec des outils comme mypy ou pyright.

TypeScript est-il plus rapide que Python ?

Pour du code gourmand en CPU écrit dans le langage lui-même, en général oui : TypeScript se compile en JavaScript, que des moteurs comme V8 compilent en code machine à l'exécution, tandis que l'interpréteur Python standard, CPython, exécute du bytecode. Les programmes Python qui passent leur temps dans des bibliothèques écrites en C (NumPy, pandas, PyTorch) ne sont pas limités par cela, et pour les serveurs limités par le réseau la différence est souvent faible.

Python a-t-il un typage statique comme TypeScript ?

Python a des type hints facultatifs (def add(a: int, b: int) -> int), mais l'interpréteur ne les impose pas : add("2", "3") s'exécute et renvoie "23". C'est un vérificateur séparé comme mypy ou pyright qui signale l'incohérence. En TypeScript, la vérification est la tâche principale du compilateur, et les projets sont normalement configurés pour que du code contenant des erreurs de type ne se construise pas.

Faut-il apprendre TypeScript ou Python en premier ?

Choisissez selon ce que vous voulez construire. Pour des sites et des applications web, apprenez JavaScript puis TypeScript, car les navigateurs n'exécutent que du JavaScript. Pour l'analyse de données, le machine learning, l'automatisation ou un premier langage avec très peu de syntaxe, commencez par Python. Les notions de base (variables, fonctions, boucles, objets) se transposent dans les deux cas.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER