Présentation

tsc-ts est une version expérimentale du compilateur TypeScript 7.0.2, entièrement réécrite en TypeScript et compilée en code natif grâce à scriptc. Le projet se trouve sous le dépôt vercel-labs/tsc-ts et se distribue via npm avec la commande :

npm install -D tsc-ts
npx tsc-ts -p tsconfig.json

Cette approche vise à offrir les performances d’un exécutable natif tout en conservant la lisibilité du code source TypeScript.

Architecture et processus de construction

Le compilateur réside dans packages/tsc-ts/src/compiler et est dérivé du projet TypeScript‑Go (tsgo) version 7.0.2. La chaîne de construction s’appuie sur plusieurs prérequis : Node.js 24+, npm, Go 1.26 et un environnement de liaison C (clang) disponible sur macOS, Linux ou Windows. Le script de compilation utilise scriptc version 0.3.5, verrouillée dans le package.json, et échoue avec toute autre version, ce qui garantit la reproductibilité des builds.

Les binaires natifs sont fournis via des dépendances optionnelles spécifiques à chaque plateforme (@tsc-ts/darwin-arm64, @tsc-ts/linux-x64-gnu, etc.). La génération du paquet se fait avec Turborepo : npm run pack:npm -w tsc-ts crée l’archive *.tgz, tandis que npm run build:native -w tsc-ts produit l’exécutable dist/tsc. L’option --binary permet d’utiliser un binaire pré‑existant au lieu de le recompiler.

Compatibilité fonctionnelle et performances

tsc‑ts expose exactement la même API que tsc --api de TypeScript 7.0.2, notamment les méthodes du service de langage telles que getCompletionsAtPosition, getDocumentationComment ou getSignatureUsages. Les réponses sont comparées ligne par ligne avec le serveur de référence tsgo, assurant une conformité stricte. Le corpus de test utilisé comprend environ 12 500 fichiers source et 17 000 unités de test après découpage, ce qui couvre la majorité des scénarios du test suite officiel.

Des benchmarks automatisés (npm run bench -w tsc-ts) mesurent le temps d’exécution de tsc‑ts contre tsgo et le compilateur JavaScript de TypeScript. Les résultats montrent que le binaire natif dépasse légèrement le compilateur JavaScript en temps de compilation, tout en restant compatible avec les outils qui consomment l’API --api. Les méthodes de profilage (startCPUProfile, stopCPUProfile) ne sont pas implémentées, ce qui constitue une différence fonctionnelle notable.

Limitations et perspectives

Le projet ne supporte pas les API de profilage et dépend d’un environnement de compilation très précis (scriptc 0.3.5, clang, Go 1.26). Toute mise à jour de ces composants nécessite une révision du processus de build, faute de quoi la compilation échoue. De plus, la version actuelle reste expérimentale : aucune garantie de stabilité à long terme n’est fournie, et les contributions sont limitées à la communauté open‑source.

Malgré ces contraintes, tsc‑ts démontre la faisabilité d’un compilateur TypeScript auto‑hébergé, ouvrant la voie à des optimisations futures, notamment l’intégration de profils de performance ou la prise en charge de versions ultérieures du langage.