Pourquoi TypeScript ne vit-il pas dans un vase clos ?
\nQuand nous écrivons en TypeScript, nous nous habituons à sa rigueur, à l'autocomplétion et aux génériques. Mais tôt ou tard, chaque développeur se pose la question : "Et si j'ai besoin d'appeler du code Python, C++ ou Go ?". Faut-il réécrire tout le projet ?
\nBonne nouvelle : TypeScript n'est pas une île isolée. Il sait collaborer avec d'autres langages via les modules natifs, WebAssembly, gRPC et même les ponts HTTP classiques. Dans cet article, nous allons analyser trois scénarios concrets d'intégration de TypeScript avec d'autres langages. Vous apprendrez comment lier le frontend, le backend et les calculs haute performance dans une même pile.
\n\nScénario 1 : TypeScript + Python — la data science sous stéroïdes
\nPython est le roi de l'apprentissage automatique et de l'analyse de données. Mais sa faiblesse réside dans les interfaces web. TypeScript, en revanche, fonctionne brillamment dans le navigateur et sur le serveur. Il est logique de combiner leurs forces.
\n\nMéthode A : Microservice HTTP (la plus simple)
\nLa voie la plus évidente est de lancer un serveur Python (par exemple, FastAPI) et de l'appeler depuis TypeScript via fetch.
\nPython (backend.py) :
\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\nimport joblib\n\napp = FastAPI()\nmodel = joblib.load('model.pkl')\n\nclass InputData(BaseModel):\n features: list[float]\n\n@app.post("/predict")\ndef predict(data: InputData):\n result = model.predict([data.features])\n return {"prediction": result.tolist()}\n\nTypeScript (frontend.ts) :
\ninterface PredictionResponse {\n prediction: number[];\n}\n\nasync function getPrediction(features: number[]): Promise<number[]> {\n const response = await fetch('http://localhost:8000/predict', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ features })\n });\n \n if (!response.ok) throw new Error('Erreur de prédiction');\n \n const data: PredictionResponse = await response.json();\n return data.prediction;\n}\n\n// Utilisation\ngetPrediction([1.2, 3.4, 5.6])\n .then(pred => console.log('Résultat :', pred))\n .catch(err => console.error(err));\n\n\nMéthode B : Scripts Python via child_process (pour le backend)
\nSi vous n'avez pas besoin d'un serveur séparé, vous pouvez exécuter Python directement depuis Node.js. C'est pratique pour des tâches ponctuelles — traitement d'images, génération de rapports.
\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execPromise = promisify(exec);\n\nasync function runPythonScript(scriptPath: string, args: string[]): Promise<string> {\n const command = `python3 ${scriptPath} ${args.join(' ')}`;\n const { stdout, stderr } = await execPromise(command);\n \n if (stderr) throw new Error(`Erreur Python : ${stderr}`);\n return stdout.trim();\n}\n\n// Exemple : transmission de JSON à Python\nconst result = await runPythonScript('./analyze.py', ['--data', '{"value": 42}']);\nconsole.log('Python a répondu :', result);\n\nImportant : cette approche est plus lente qu'un microservice, mais ne nécessite pas la configuration d'un serveur séparé. Elle convient aux prototypes et aux CI/CD.
\n\nScénario 2 : TypeScript + C++ — la vitesse à la limite de la fantaisie
\nQuand il faut traiter de la vidéo, de l'audio ou de la cryptographie, Python peut ne pas suffire. C'est là qu'interviennent le C++ et son puissant allié — WebAssembly (WASM).
\n\nCompilation du C++ en WASM et appel depuis TypeScript
\nSupposons que nous ayons une simple fonction en C++ qui accélère la multiplication de matrices :
\n// matrix.cpp\nextern "C" {\n void multiply_matrices(float* a, float* b, float* result, int size) {\n for (int i = 0; i < size; i++) {\n for (int j = 0; j < size; j++) {\n float sum = 0.0f;\n for (int k = 0; k < size; k++) {\n sum += a[i * size + k] * b[k * size + j];\n