ts-rust (aka tsc-rs)

Motivaties

De drijfveren achter dit project zijn:

  • Het testen van de mogelijkheden van LLM-modellen.
  • Het creëren van een snelle TypeScript type-checker.
  • Het ontwikkelen van een TypeScript-checker die met hoge prestaties in WASM kan werken.
  • Memes.

Waarschuwingen

Dit is een vroege release. In alle geteste real-world projecten is er 100% compatibiliteit, waardoor het voor de overgrote meerderheid van de applicaties als een directe vervanger zou moeten werken. Raadpleeg de sectie "Bekende problemen" voor meer details.

Opmerkelijk is dat de auteur van het project zelf geen enkele regel van de gegenereerde code heeft gelezen.

Installatie

Let op: er is geen garantie dat dit in elke omgeving werkt.

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

Ontwikkelingsproces en kosten

Het porting-proces is uitgevoerd met diverse OpenAI-modellen. In totaal is er meer dan $400.000 aan API-tokens besteed aan GPT-5.6 Sol en GPT 6 Astra. Deze modellen schreven over meerdere maanden tijd meer dan 1,3 miljoen regels Rust via /goal-loops, maar bereikten nooit meer dan 84% compatibiliteit.

Toen de auteur merkte dat de limieten van Claude Code minder snel werden verbruikt, is Opus 5.5 ingezet. Dit model produceerde binnen 10 uur een werkende v0. In tegenstelling tot de verwachting bleek Opus 5.5 niet voort te bouwen op de code van de Codex-modellen, maar volledig vanaf nul te beginnen. Het model ging verder dan Astra in een tiende van de tijd.

De uiteindelijke kosten voor de voltooiing via Claude bedroegen ongeveer $24.047 aan API-uitgaven over een periode van twee weken. Dit kwam overeen met 925% tot 983% van de wekelijkse limieten van een $200-plan.

Wat is ts-rust precies?

ts-rust is een directe poort van de native TypeScript-compiler van Microsoft die in Go is geschreven (microsoft/TypeScript, voorheen typescript-go). Het behoudt de algoritmen en het gedrag van de Go-versie en hanteert dezelfde command-line (tsc), language server en API.

Installatie en platformen

De installatie verloopt via npm:

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

tsc-rs accepteert dezelfde opties als tsc. De npm-pakketnaam is tsc-rs om conflicten met het officiële typescript-pakket te voorkomen. Elke release bevat ook een standalone archief per platform (het tsc-binair bestand met de bijbehorende lib-bestanden).

Beschikbare platformen:

  • Linux x64 (statisch, elke distributie)
  • macOS arm64
  • Windows en Linux arm64 zijn momenteel nog niet beschikbaar.

Voor gebruik in VS Code kan worden verwezen naar de README van het npm-pakket.

Effect-diagnostiek

tsc-rs heeft de Effect language service diagnostics (codes 377xxx) ingebouwd, waardoor een Effect-project geen tweede compiler nodig heeft. Deze diagnostics komen voort uit dezelfde check als de TypeScript-diagnostics en worden ook door de language server getoond. Ze worden alleen uitgevoerd wanneer de tsconfig de plugin bevat, net als bij @effect/language-service:

{
  "compilerOptions": {
    "plugins": [{ "name": "@effect/language-service" }]
  }
}

De regels, opties en @effect-diagnostics commentaren zijn een poort van Effect-TS/tsgo 0.46.1. De editor-functies van de language service (zoals quick fixes, refactors, hover en completions) zijn niet gepoort.

Status en compatibiliteit

De poort is vastgepind op één upstream revisie: microsoft/TypeScript 673a5f17d713 (2026-09-29, TypeScript 7.1.0-dev; zie UPSTREAM.md) en is vergeleken met de Go-versie van diezelfde revisie. Voor vergelijkingen dient typescript@7.1.0-dev.20260929.1 te worden gebruikt, en niet 7.0.x of @typescript/native-preview.

Resultaten

  • Identieke output: TanStack Query core en Hono vertonen diagnostiek die identiek is aan die van Go. Alle 181.711 gepoorte Go-tests zijn geslaagd. De antwoorden van de language server en API komen overeen met Go in de oracle-testsets.
  • Snelheid: Bij 60 open-source projecten neemt de type-checking ongeveer de helft van de tijd in beslag vergeleken met Go (geometrisch gemiddelde). De preview-pakketten zijn gebouwd in CI zonder PGO en BOLT, waardoor ze langzamer zijn dan de gemeten build.
  • Real-world projecten: Bij 120 open-source repo's verschilt de output van de command-line alleen op de punten die onder "Bekende problemen" worden genoemd en waar de output van Go zelf per run verschilt.

Benchmarks

Benchmark: T3 Code

Volledige type-check van T3 Code, vergeleken met tsc 6, tsc 7 en de nieuwe bun check in Bun. T3 Code gebruikt Effect, waardoor er twee scenario's zijn.

Zonder Effect-diagnostics

CheckerTijdvs tsc 6vs tsc 7bun check
bun check4.07s15.4×3.95× sneller-
tsc-rs7.25s8.6×2.22× sneller-
tsc 716.10s3.9×baseline-
tsc 662.63sbaseline3.89× langzamer-

Met Effect-diagnostics

CheckerTijdvs tsc 6vs tsc 7 + Effect
tsc-rs (Effect ingebouwd)11.13s12.5×1.89× sneller
tsc 7 + @effect/tsgo21.07s6.6×baseline
bun check, dan effect-tsgo diag.37.60s3.7×1.78× langzamer
tsc 6 + @effect/language-service138.63sbaseline6.58× langzamer

bun check is het snelst wanneer Effect-diagnostics niet nodig zijn. Echter, voor Effect-projecten heeft tsc-rs het voordeel dat deze diagnostics in één check worden meegenomen.

Benchmark: Real-world apps

Volledige type-check van zes open-source apps. De multiplier geeft de versnelling ten opzichte van tsc 6 weer.

AppRegels gecheckttsc 6tsc 7tsc-rsbun check
VS Code3.75M54.56s6.84s (8.0×)4.20s (13.0×)1.62s (33.7×)
Sentry (frontend)2.11M58.76s7.90s (7.4×)4.46s (13.2×)3.14s (18.7×)*
Playwright585k4.48s0.66s (6.8×)0.34s (13.2×)0.18s (25.0×)
Excalidraw449k5.32s0.80s (6.7×)0.70s (7.6×)0.18s (29.0×)
TypeORM386k3.86s0.55s (7.0×)0.36s (10.7×)0.19s (20.0×)
tRPC (server package)209k1.10s0.16s (6.8×)0.09s (12.0×)0.12s (9.1×)*
Geometrisch gemiddelde--7.1×11.4×20.9×

Vergeleken met tsc 7 is tsc-rs 1,61× sneller en bun check 2,95× sneller. bun check is het snelst op elke app, behalve tRPC.

Opmerkingen bij de metingen:

  • bun check rapporteert fouten die geen enkele andere checker rapporteert (3 bij Sentry, 2 bij tRPC).
  • tsc-rs rapporteert 10 fouten bij VS Code en 2 bij Sentry. Deze komen exact overeen met TypeScript 7.1.0-dev.
  • Metingen zijn uitgevoerd op een Apple M4 Pro (12 cores, 48 GB), macOS 26.5.1 met hyperfine (mediaan van 5 runs).

Bekende problemen

  • Monorepos: In sommige monorepos zijn bronbestanden van een workspace-pakket zowel via node_modules als via een directe import bereikbaar. tsc-rs kan hierdoor voor meer bestanden output schrijven dan tsc en rapporteert dan TS6059 (bestand bevindt zich niet onder rootDir). In tegenstelling tot tsc is het resultaat van tsc-rs hierbij consistent per run.
  • Project References (tsc -b): Wanneer een project de output van een ander project importeert zonder een project referentie, kan tsc-rs oude of ontbrekende output lezen (TS2305 of TS2307), terwijl tsc de nieuwe output leest. Dit kan worden opgelost door de referentie toe te voegen.
  • Geheugengebruik: In de editor groeit het geheugengebruik langzaam tijdens lange sessies (ongeveer 20 MiB per 1.000 edits), maar dit blijft onder het verbruik van tsc.
  • Versie-weergave: tsc-rs --version print de TypeScript-versie die is gepoort (7.1.0-dev), niet de npm-versie.

Ontwikkeling

Structuur

  • crates/tsgoport: De compiler, bestaande uit crates, goportutil en goportlsproto in crates/tsgoport/parts, gebruikmakend van de lib-bestanden in crates/ts_goport/libs.
  • tools/tsastcodegen: Genereert crates/ts_goport/src/astdata.
  • tools/tsdiagnosticscodegen: Genereert crates/tsgoport/src/diagnostics/catalog.rs en crates/tsgoport/src/diag.rs.
  • crates/ts_wasm: De WebAssembly-build (npm/wasm).

Commando's voor ontwikkeling

Build:

./scripts/run-cargo-capped.sh build --release -p ts_goport --bins

Verificatie:

./scripts/verify.sh

De resulterende binaries zijn goport (type check) en tsgo (de Go tsgo command line).

Licentie

Het project staat onder de MIT-licentie. De poort behoudt de licenties en notices van de originele code: TypeScript (Apache-2.0) en delen van de Go standaardbibliotheek (BSD-3-Clause). Zie NOTICE.md voor details.