Por que o TypeScript não vive no vácuo?
\nQuando escrevemos em TypeScript, nos acostumamos com sua rigidez, autocompletar e genéricos. Mas mais cedo ou mais tarde, todo desenvolvedor se depara com a pergunta: "E se eu precisar chamar código em Python, C++ ou Go?". Não vamos reescrever o projeto inteiro?
\nA boa notícia: TypeScript não é uma ilha isolada. Ele consegue se integrar com outras linguagens através de módulos nativos, WebAssembly, gRPC e até pontes HTTP comuns. Neste artigo, vamos explorar três cenários reais de integração do TypeScript com outras linguagens. Você aprenderá como unir frontend, backend e computação de alto desempenho em uma única stack.
\n\nCenário 1: TypeScript + Python — ciência de dados turbinada
\nPython é o rei do aprendizado de máquina e análise de dados. Mas sua fraqueza são as interfaces web. TypeScript, por outro lado, funciona brilhantemente no navegador e no servidor. É lógico unir suas forças.
\n\nMétodo A: Microsserviço HTTP (o mais simples)
\nO caminho mais óbvio é iniciar um servidor Python (por exemplo, FastAPI) e chamá-lo a partir do TypeScript usando 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('Erro de predição');\n \n const data: PredictionResponse = await response.json();\n return data.prediction;\n}\n\n// Uso\ngetPrediction([1.2, 3.4, 5.6])\n .then(pred => console.log('Resultado:', pred))\n .catch(err => console.error(err));\n\n\nMétodo B: Scripts Python via child_process (para backend)
\nSe você não precisa de um servidor separado, pode executar Python diretamente do Node.js. Isso é útil para tarefas pontuais — processamento de imagens, geração de relatórios.
\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(`Erro Python: ${stderr}`);\n return stdout.trim();\n}\n\n// Exemplo: passando JSON para Python\nconst result = await runPythonScript('./analyze.py', ['--data', '{"value": 42}']);\nconsole.log('Python respondeu:', result);\n\nImportante: essa abordagem é mais lenta que um microsserviço, mas não requer configuração de um servidor separado. Adequada para protótipos e CI/CD.
\n\nCenário 2: TypeScript + C++ — velocidade no limite da fantasia
\nQuando é necessário processar vídeo, áudio ou criptografia, o Python pode não ser suficiente. É aqui que entra o C++ e seu poderoso aliado — WebAssembly (WASM).
\n\nCompilação de C++ para WASM e chamada a partir do TypeScript
\nSuponha que temos uma função simples em C++ que acelera a multiplicação de matrizes:
\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