Warum lebt TypeScript nicht im Vakuum?
\nWenn wir in TypeScript schreiben, gewöhnen wir uns an seine Strenge, Autovervollständigung und Generics. Aber früher oder später steht jeder Entwickler vor der Frage: "Was, wenn ich Code in Python, C++ oder Go aufrufen muss?". Soll ich etwa das ganze Projekt umschreiben?
\nDie gute Nachricht: TypeScript ist keine isolierte Insel. Es kann sich mit anderen Sprachen über native Module, WebAssembly, gRPC und sogar einfache HTTP-Brücken verbinden. In diesem Artikel betrachten wir drei reale Integrationsszenarien von TypeScript mit anderen Sprachen. Sie erfahren, wie Sie Frontend, Backend und hochperformante Berechnungen in einem Stack zusammenkleben.
\n\nSzenario 1: TypeScript + Python — Data Science auf Steroiden
\nPython ist der König des maschinellen Lernens und der Datenanalyse. Aber seine Schwäche sind Weboberflächen. TypeScript hingegen funktioniert hervorragend im Browser und auf dem Server. Es ist logisch, ihre Kräfte zu bündeln.
\n\nMethode A: HTTP-Mikroservice (am einfachsten)
\nDer naheliegendste Weg ist, einen Python-Server (z.B. FastAPI) zu starten und ihn aus TypeScript per fetch aufzurufen.
\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('Vorhersagefehler');\n \n const data: PredictionResponse = await response.json();\n return data.prediction;\n}\n\n// Verwendung\ngetPrediction([1.2, 3.4, 5.6])\n .then(pred => console.log('Ergebnis:', pred))\n .catch(err => console.error(err));\n\n\nMethode B: Python-Skripte über child_process (für das Backend)
\nWenn Sie keinen separaten Server benötigen, können Sie Python direkt aus Node.js heraus ausführen. Das ist praktisch für einmalige Aufgaben – Bildverarbeitung, Berichtserstellung.
\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(`Python-Fehler: ${stderr}`);\n return stdout.trim();\n}\n\n// Beispiel: JSON an Python übergeben\nconst result = await runPythonScript('./analyze.py', ['--data', '{"value": 42}']);\nconsole.log('Python antwortete:', result);\n\nWichtig: Dieser Ansatz ist langsamer als ein Mikroservice, erfordert aber keine Einrichtung eines separaten Servers. Geeignet für Prototypen und CI/CD.
\n\nSzenario 2: TypeScript + C++ — Geschwindigkeit jenseits der Fantasie
\nWenn Sie Video, Audio oder Kryptographie verarbeiten müssen, reicht Python möglicherweise nicht aus. Hier kommt C++ und sein mächtiger Verbündeter ins Spiel – WebAssembly (WASM).
\n\nKompilierung von C++ zu WASM und Aufruf aus TypeScript
\nAngenommen, wir haben eine einfache C++-Funktion, die die Matrixmultiplikation beschleunigt:
\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