Originally published at kunalganglani.com — read it there for inline code, hero image, and live links.
TypeScript 7 “going native” is one of those rare tooling shifts that actually changes your day. Not in a fluffy “developer experience” way. In a “why did my CI just drop from 12 minutes to 2?” way.
This post is my practical take on the TypeScript 7 native compiler benchmark conversation: what “native” really means, how to measure it without kidding yourself, and what tends to break when you upgrade.
Key takeaways
- You can’t trust a single “10x faster” screenshot. You need clean vs incremental runs, and you must separate
--noEmittype-checking from emit. - A good TypeScript 7 native compiler benchmark controls for CPU, disk, Node version (even if TS7 isn’t running on it), and caching.
- Most migrations fail on boring stuff: monorepo project references,
.tsbuildinfoplacement, and CI cache keys. - Path aliases (
baseUrl/paths) are still the #1 “it type-checks but doesn’t run” footgun after upgrading. - Editor speedups are real only if your bottleneck was
tsserverCPU time. If your bottleneck is language-service plugins or filesystem churn, you might feel nothing.
If you don’t benchmark clean, warm, incremental, and
--noEmit, you’re not measuring TypeScript speed. You’re measuring your cache.
What “Native” Actually Means
TypeScript 7 “going native” means the compiler and language service tooling (tsc, tsserver) are no longer JavaScript programs running on Node.js. Microsoft rewrote the toolchain in Go and ships it as a native binary.
Your TypeScript still compiles to JavaScript the same way it always has.
That last line matters because half the internet immediately jumped to “so TS doesn’t need to compile anymore.” No. This isn’t Node’s type-stripping story and it isn’t a new runtime. It’s a faster compiler front-end.
I like Nazar Boyko’s framing: it’s a tooling story, not a language story. Your codebase doesn’t magically run faster. Your feedback loop gets faster.
A useful mental model:
-
TS6 and earlier:
tscandtsserverare JS programs. They run on Node. Performance is bounded by Node startup overhead, garbage collection behavior under compiler workloads, and the compiler’s own algorithms. - TS7 native: the same logical phases exist (parse, bind, check, emit), but the implementation is in Go and distributed as a native executable. Startup time changes. Memory behavior changes. A few hot paths get a lot cheaper.
If you’ve ever profiled TypeScript builds, you know the usual time sinks are type-checking and module resolution churn. A native binary can improve both just by being better at raw CPU and memory behavior.
Where the 10x Comes From
Microsoft didn’t pull “10x faster” out of thin air. The headline numbers are legitimately dramatic.
As cited by Nazar Boyko, Microsoft’s published full-build benchmarks show:
- VS Code full build: 125.7s (TS6) → 10.6s (TS7), an 11.9x speedup.
- Sentry full build: 139.8s (TS6) → 15.7s (TS7), an 8.9x speedup.
- Playwright full build: 12.8s (TS6) → 1.47s (TS7), an 8.7x speedup.
Earlier announcement numbers (also summarized in the same post) are similarly aggressive:
- VS Code (~1.5M LOC): type-check 77.8s → 7.5s.
- TypeORM: 17.5s → 1.3s.
- tRPC: 5.5s → 0.6s.
Now the pragmatic part.
Those are real repos. They’re also very specific repos with very specific build graphs, cache states, machines, and settings. They prove the native compiler can be fast. They don’t promise your repo gets 10x.
The speedup comes from a few boring-but-real places:
-
Less process overhead: spawning
tscin CI or watch mode costs less. - Different memory behavior: Go’s runtime and data structures behave differently than V8 under compiler-shaped workloads.
- Hot path wins: type-checking and symbol resolution can benefit disproportionately from fewer allocations and less GC pressure.
But build time is never one thing. It’s CPU plus filesystem plus cache plus project topology. If you ignore that, you end up with benchmark results that look amazing and don’t move the one number your team actually cares about.
TypeScript 7 Native Compiler Benchmark: A Reproducible Recipe
Here’s the benchmark harness I’d actually want an engineering team to copy. The goal isn’t perfection. The goal is repeatability.
0) Pick what you’re measuring
You need four measurements, minimum:
- Clean + emit (worst case, CI-like)
-
Clean +
--noEmit(type-check only) - Incremental + emit (dev loop for composite builds)
-
Incremental +
--noEmit(fast PR guardrail)
If you only run one command, you’re doing marketing, not engineering.
1) Pin versions like you mean it
Benchmarking on “whatever Node” and “whatever TypeScript” is how you end up arguing in Slack for three days.
- Pin TypeScript versions explicitly in
package.json(TS6 and TS7). - Pin your package manager and lockfile.
- Run on the same machine class (or at least the same CPU generation).
Even if TS7 is native, your pipeline still shells out to Node-based tooling around it. You’re measuring a pipeline, not a single executable in isolation.
2) Control the environment (cold vs warm)
For each scenario, do 3 runs and record the median.
Cold runs:
- Clear TypeScript incremental state (
*.tsbuildinfoif you use project references). - Clear
dist/(or whatever your emit output directory is). - If you want “worst-case CI,” also clear your package manager store cache. But only do this if that’s actually what your CI looks like. Otherwise you’re measuring a misery fantasy.
Warm runs:
- Keep
.tsbuildinfo. - Keep output directories.
- Don’t touch
node_modules/.
3) Use a timing approach you can reproduce
On macOS/Linux, the built-in time is fine. In CI, your runner’s step timing is fine too.
What matters is you capture:
- OS, CPU model, RAM
- repo size (LOC or number of TS files)
- TypeScript version
- exact command
If you can’t tell someone else how to re-run your benchmark and get the same shape of results, it’s not a benchmark. It’s a vibe.
4) Benchmark commands (template)
I avoid giant code blocks, but you do need a concrete recipe. Keep it simple:
-
tsc -b --clean(if using project references) -
tsc -b(emit) -
tsc -b --noEmit(type-check only) -
tsc -b -w(watch mode smoke test)
If you’re not using project references, drop -b and measure your root tsconfig.json build.
5) Record results in a small table
Here’s the table format I want you to use. This is the “AI Overview extraction surface” and it’s also what your team will paste into an RFC.
| Scenario | TS6 time (s) | TS7 time (s) | Speedup |
|---|---|---|---|
| Clean + emit | fill | fill | x.x |
| Clean + noEmit | fill | fill | x.x |
| Incremental + emit | fill | fill | x.x |
| Incremental + noEmit | fill | fill | x.x |
If your repo is medium-sized (say 50k–300k LOC), a believable outcome might be anywhere from 2x to 10x depending on how type-check-heavy you are.
6) How to interpret the numbers without lying to yourself
A few rules of thumb I’ve learned from performance work (and from maintaining reproducible benchmarks on this site):
Based on the benchmark methodology I maintain at kunalganglani.com/llm-benchmarks, the biggest benchmarking mistakes always look the same: uncontrolled caches, mixed hardware, and accidentally comparing different workloads.
Same idea here. Don’t claim “TS7 is 9x faster” if:
- your TS6 run was cold but your TS7 run was warm
- you changed
skipLibCheck,incremental, orcomposite - your CI runner type changed
Also: if your build graph is dominated by bundling, minification, or test startup, TypeScript can get 10x faster and your pipeline will barely move. That’s not TypeScript’s fault. That’s you measuring the wrong thing.
What Changes In Your Day
This is the part people actually care about.
CI build times
If you have a type-check step in PR checks, TS7 can be an immediate win. If that step is currently 60–180 seconds, dropping it to 10–40 seconds changes how teams work.
It’s not just time saved. It’s fewer “I’ll just push and go do something else” context switches. Those are productivity killers nobody tracks because they don’t show up on a dashboard.
Monorepo productivity
In monorepos with project references, the native compiler’s speed can compound because you’re invoking the checker many times across packages.
Faster incremental rebuilds show up as less fan noise on dev laptops and fewer “wait, why is it still building?” moments. The boring kind of happiness.
tsserver / editor responsiveness
This is the sleeper feature.
If TypeScript 7’s native tsserver reduces CPU time, you may see:
- faster “go to definition”
- quicker autocomplete in big files
- less editor jank when the project graph updates
But it’s not magic. If your editor is dragging because of language-service plugins, or your bottleneck is filesystem watching (especially on networked filesystems), you might not feel much.
If your team is already leaning into Claude Code or other AI coding tools, TS7 matters even more because those tools amplify iteration. Faster type-check means fewer “AI suggested a refactor, now I’m waiting 90 seconds to see if it compiles” loops.
What Doesn’t Change
A surprising amount.
You still compile TypeScript to JavaScript
TypeScript 7 doesn’t remove emit. Your runtime is still Node (or a browser, or a bundler). The output is still JS.
If you want “no compile step,” that’s a different conversation involving type-stripping runtimes and build tooling. TypeScript 7 is about making the compiler less painful, not removing it.
Your type system semantics should be boring
The whole point is that TS7’s native compiler is supposed to match the same language behavior. You’re not signing up for new syntax or a new type system.
Your bundler is still your bundler
Vite, Webpack, tsup, SWC, esbuild. None of those stop mattering because tsc got faster.
In most modern stacks, tsc is used for type-checking while a separate tool handles transpile+bundle. TS7 can make that type-check step way cheaper, but it doesn’t replace the rest of your pipeline.
Timeline And Migration, Honestly
I’m going to be blunt: the right migration strategy is boring. You don’t big-bang this across a monorepo on a Friday.
Here’s the rollout pattern I’d use.
Step 1: Canary in CI
Create a separate CI job that runs TS7 type-checking in parallel with your existing TS6 check.
- Don’t block merges on day 1.
- Capture timings for a week.
- Track failure diffs.
Your goal is twofold: verify correctness and measure speed. One without the other is useless.
Step 2: Pin and isolate
Pin TS7 at the workspace root.
If your monorepo has packages that must stay on TS6 temporarily, keep them on TS6. But stop mixing outputs and stop pretending “it’ll probably be fine.” Compilers are not the place to be vibes-driven.
Step 3: Roll forward with a rollback plan
A rollback plan is not “we can revert the PR.” It’s:
- keep TS6 in the lockfile for a while
- keep CI jobs for both versions for a few days
- know exactly which flags you changed
When you’re dealing with a compiler upgrade, the failure mode is not just “it breaks.” It’s “it’s slower on Windows runners” or “incremental state behaves differently.” Rollbacks need to be operational, not theoretical.
Migration Checklist (Monorepos, Path Aliases, Incremental, CI)
This is the part missing from most posts.
Monorepos: project references and composite builds
If you use tsc -b, your build graph is sensitive to tsconfig structure.
Checklist:
- Verify each package that participates in
-bhascomposite: true. - Make sure output directories don’t overlap. Overlapping
outDiris how you create heisenbugs. - Ensure references are complete. Missing references often “work” in TS6 but create weird incremental behavior.
- Decide where
.tsbuildinfolives. In monorepos, I prefer a predictable location per package so caching is sane. - Benchmark per-package and whole-graph builds. A native compiler can make leaf packages ridiculously fast, but your root build might still be dominated by the fattest package.
Path aliases: type-check vs runtime resolution
This is where teams get burned.
baseUrl/paths are a TypeScript compile-time concept. Your runtime resolution depends on Node, bundler config, or tsconfig-paths-style loaders.
Upgrade checklist:
- Audit every alias and ensure your bundler/runtime agrees.
- Validate by running at least one production-like start command after the upgrade.
- In CI, add a minimal “build + run” smoke test, not just type-check.
Incremental builds and .tsbuildinfo
Yes, incremental builds still matter. In fact, they matter more because TS7 makes the remaining overhead visible.
Practical notes:
- Don’t share
.tsbuildinfobetween TS6 and TS7 runs. Treat it as compiler-version-specific state. - In CI, cache
.tsbuildinfoonly when it matches your branch/commit strategy. Caching across unrelated commits can produce misleading wins or subtle inconsistencies.
CI caching strategy that doesn’t lie
If you’re serious about cutting CI time, cache the right layers:
- Package manager store (pnpm store, Yarn cache, npm cache)
- Build outputs (
dist) when safe - TypeScript incremental state (
.tsbuildinfo) keyed appropriately
Cache keys matter more than the cache mechanism.
A sane cache key often includes:
- OS + architecture
- lockfile hash
- TypeScript version
-
tsconfighash
If you omit TS version from the key, you can accidentally “benchmark” TS7 using TS6 incremental artifacts. That’s not a win. That’s a measurement bug.
If your org is already investing in CI/CD improvements, TS7 is one of the highest leverage upgrades you can make because it speeds up the part of the pipeline you run on every PR.
How to Benchmark Your Repo Without Cargo Culting Microsoft’s Numbers
A few answers to the common questions people ask in threads.
“Is TypeScript 7 faster than TypeScript 6?”
Usually, yes. In many real repos, dramatically so.
Microsoft’s published examples range from 8.7x to 11.9x for full builds, and type-checking benchmarks show similar leaps. But your speedup depends on whether TypeScript is the bottleneck.
If your build is dominated by bundling, tests, or Docker image builds, TS7 won’t feel like 10x. You’ll still have made TypeScript cheaper. You just won’t have changed the critical path.
“Will TS7 improve editor performance?”
If tsserver CPU time is what’s making VS Code sluggish, the native toolchain should help.
If the slowdown is elsewhere (extensions, filesystem watching, monorepo indexing), don’t expect miracles. The best way to know is to measure before/after in your actual workspace instead of debating it on the internet.
If you’re pushing into AI agents for coding tasks, faster language tooling becomes part of the baseline. Agentic refactors produce bigger diffs. Bigger diffs make type-checking costlier. Speed matters.
Named experts worth paying attention to
There’s a lot of noise around TypeScript tooling right now, especially mixed in with AI hype.
- Nazar Boyko has the clearest breakdown of what changes and what doesn’t.
- Fireship has a fast overview that’s useful for sharing with a team that won’t read a long post.
- Simon Willison is consistently good at separating “new tool” excitement from operational reality. If you want a model for evaluating dev tooling without getting scammed by hype, study his writing.
Here’s the Fireship explainer if you want the 5-minute version to send around:
[YOUTUBE:PQ2WjtaPfXU|Microsoft goes nuclear on TypeScript codebase…]
A few adjacent lessons from shipping AI systems
This might sound like a weird tangent, but it’s the same pattern.
When I built the Walmart conversational commerce chatbot, the system handled millions of queries daily with sub-second responses, and the big lesson was that end-to-end performance is dominated by the slowest boring component. Not the flashy one.
Compiler speedups work the same way. TypeScript 7 can be 10x faster and you still won’t feel it if your CI is dominated by pnpm install on uncached runners or integration tests that take 9 minutes.
If you want a mental framework for benchmarking and rollout discipline, you can borrow from how I think about RAG systems. In both cases, you need:
- a reproducible harness
- controlled inputs
- a rollback plan
- and an honest interpretation of results
Also, don’t ignore security just because this is “only tooling.” If you’re using AI coding tools, you should have a policy for prompt injection and for data exposure in your dev environment. Faster compiles won’t save you from shipping secrets.
Conclusion: the real win is shorter feedback loops, not bragging rights
TypeScript 7 going native is the kind of change I actually like. It’s not a “new framework.” It’s an upgrade that cuts wasted time.
Run the benchmark harness above in your repo. Put the results table in your engineering channel. If TS7 saves you even 60 seconds per PR, that compounds into real developer hours over a quarter.
My prediction: by mid-2027, teams that still tolerate multi-minute type-check steps will look as outdated as teams still manually SSH’ing into servers to deploy. Your toolchain is part of your product. Treat it like one.
Originally published on kunalganglani.com
Top comments (0)