TypeScript 7 Native Preview: Project Corsa Rewrites the Compiler in Go, and It Changes Everything

TypeScript 7 Native Preview: Project Corsa Rewrites the Compiler in Go, and It Changes Everything

lschvn12 min read

Microsoft's VS Code codebase compiles in 7.5 seconds under the TypeScript 7 native preview, versus 77.8 seconds with the current JavaScript-based compiler. That's a 10× improvement, and it's the headline result of Project Corsa, Microsoft's full rewrite of the TypeScript compiler and language service in Go.

TypeScript 7 changes that. Or rather, it will, but the preview is already here, and the numbers are hard to argue with.

Project Corsa: The Native Port

In early 2025, Microsoft announced Project Corsa, a full native port of the TypeScript compiler and language service to Go. The goal was ambitious: ~10x faster build times and significantly improved editor responsiveness.

The initial benchmarks were striking. On the VS Code codebase itself, a large, real-world TypeScript project, compilation dropped from 77.8 seconds to 7.5 seconds. On the Playwright test suite, it went from 11.1 seconds to 1.1 seconds. These aren't synthetic micro-benchmarks. They're the same codebase Microsoft uses to build VS Code, running on the same hardware.

The port isn't complete yet. TypeScript 6.0 remains the JavaScript-based release that the ecosystem transitions through. Microsoft has indicated that TypeScript 6.0 will be the last major version built on the JS-based toolchain. TypeScript 7 is where the native era begins in earnest.

What "Native" Actually Means in Practice

There are two dimensions to what TypeScript 7 changes, and it's worth separating them.

The compiler (tsc), The command-line TypeScript compiler. A Go-based tsc means faster compiles, lower memory usage during builds, and better integration with non-JavaScript toolchains. For projects that run tsc as part of CI pipelines, this translates directly into faster feedback cycles.

The language service, This is what powers VS Code's IntelliSense, error underlining, jump-to-definition, and refactoring. Editor performance is bottlenecked on the language service, not the compiler. Microsoft reports that project load times have decreased roughly 8x in early testing. For anyone who has waited 30+ seconds for a large TypeScript project to become responsive in VS Code, that number matters.

Node.js Type Stripping: Running TypeScript Without Transpiling

In parallel with the native compiler work, Node.js has been shipping native TypeScript support through a feature called type stripping. This is a fundamentally different approach to running TypeScript, instead of compiling .ts files to .js, Node.js can now execute TypeScript directly by stripping type annotations before execution.

The timeline moved fast:

  • Node.js 22.18.0 (July 2025) enabled type stripping by default
  • Warnings were removed in v24.3.0/22.18.0
  • The feature stabilized in v25.2.0

The key distinction is between erasable syntax (types, interfaces, anything that disappears at runtime) and runtime syntax (enums, namespaces, things that produce actual JavaScript). Type stripping works cleanly for the former. For the latter, the Node.js team has introduced a --erasableSyntaxOnly flag that enforces this separation explicitly.

This means you can now write a TypeScript file and run it with node file.ts, no build step, no transpilation. For scripts, CLIs, and quick prototyping, this is a meaningful workflow improvement. For production builds, you'll still want tsc for cross-targeting and full type checking, but the gap between "I want to try something" and "running code" shrinks considerably.

What Developers Need to Do Now

The transition isn't automatic, and there are concrete steps worth taking ahead of the shift:

Audit enum and namespace usage. These are the TypeScript features that don't have a clean erasable equivalent. Enums can be replaced with as const objects; namespaces can migrate to ES modules. If your codebase uses either heavily, start the migration now.

Enable --erasableSyntaxOnly in CI. This flags any non-erasable TypeScript syntax in your codebase, giving you a clear migration roadmap before type-stripping becomes the default behavior.

Add TypeScript 7 preview to CI pipelines. The @typescript/native-preview npm tag lets you test the Go-based compiler against your codebase today. It won't replace your production build yet, but it surfaces any issues before the migration lands.

Watch for strict-by-default changes. TypeScript 6.0 is considering making strict mode the default for new projects. If you've been putting off enabling strict checks, now is the time, it won't be optional much longer.

The Bigger Picture

Two forces are converging. The first is compiler performance: a native TypeScript compiler solves the biggest pain point in the day-to-day developer experience, slow editor startup and sluggish type-checking in large codebases. The second is runtime support: Node.js running TypeScript natively removes the last friction point between writing a type-annotated file and executing it.

Together, they move TypeScript from "a language that compiles to JavaScript" toward something closer to a first-class systems language for the JavaScript ecosystem. Whether that's a good thing depends on your perspective, but the direction is clear, and the performance gains are real.

The JavaScript-based TypeScript era isn't over yet. But TypeScript 7, with its Go-based compiler and the Node.js type-stripping feature it enables, is the beginning of a different chapter.

Frequently Asked Questions

Related articles

More coverage with overlapping topics and tags.

TypeScript 6.0 Ships: The Last JavaScript-Based Release Before the Go Rewrite
runtimes

TypeScript 6.0 Ships: The Last JavaScript-Based Release Before the Go Rewrite

Microsoft ships TypeScript 6.0 as the final release built on the original JavaScript codebase. DOM type updates, improved inference, subpath imports, and a migration flag set the stage for the native Go-based TypeScript 7.0.
Turborepo 2.10.3 Recognizes nub and aube, Two New Rust-Based Node.js Package Managers From Colin McDonnell (Zod) and Jeff Dickey (mise)
tooling

Turborepo 2.10.3 Recognizes nub and aube, Two New Rust-Based Node.js Package Managers From Colin McDonnell (Zod) and Jeff Dickey (mise)

Turborepo [v2.10.3](https://github.com/vercel/turborepo/releases/tag/v2.10.3) shipped on 2026-07-03 with first-class support for [nub](https://github.com/nubjs/nub) and [aube](https://github.com/jdx/aube), two Rust-based Node.js package managers that emerged in spring and summer 2026. nub is authored by Colin McDonnell (creator of [Zod](https://github.com/colinhacks/zod), 43k stars) and aube by Jeff Dickey (creator of [mise](https://github.com/jdx/mise)); both integrate with Turborepo as `packageManager` values in `package.json` and `devEngines.packageManager`. The release also lands a new TUI/streamed-logs toggle, click-to-select tasks in the TUI task list, auto-copy of TUI selections to clipboard on mouse release, a `--production` flag on `turbo prune`, TypeScript 7.0.1-rc as the workspace toolchain, thin LTO + `codegen-units=1` for release builds, and a long list of cache-hashing perf fixes. The headline signal: two of the JS toolchain's most respected builders are now shipping package managers that ride on stock Node instead of replacing it, and Turborepo is the first mainstream monorepo tool to formalize both.
Node.js 26.4.0 'Current' Ships node:vfs Subsystem (Matteo Collina), ESM Loader Package Maps (Maël Nison), TLS Certificate Compression, TCP_KEEPINTVL/TCP_KEEPCNT, and argon2 Stable
runtimes

Node.js 26.4.0 'Current' Ships node:vfs Subsystem (Matteo Collina), ESM Loader Package Maps (Maël Nison), TLS Certificate Compression, TCP_KEEPINTVL/TCP_KEEPCNT, and argon2 Stable

Node.js 26.4.0 (Current), published 2026-06-24 by @aduh95, lands eight SEMVER-MINOR changes: a minimal node:vfs subsystem that mounts user-supplied virtual filesystems (PR #63115, Matteo Collina) plus a follow-up that dispatches node:fs/promises to mounted VFS instances (PR #63537), package maps for ESM loaders that route bare specifiers through the loader hooks (PR #62239, Maël Nison), TLS certificateCompression that wires RFC 8879 zlib and zstd compression through the OpenSSL build config (PR #62217, Tim Perry), TCP_KEEPINTVL and TCP_KEEPCNT support in net.Socket.setKeepAlive (PR #63825, Guy Bedford), caller-supplied buffers in fs.readFile / fs.readFileSync (PR #63634, Matteo Collina), closeIdleConnections that now also drops pre-request sockets (PR #63470, semimikoh), net.BlockList advanced to Release Candidate stability (PR #63050), and crypto argon2 + KEM encap/decap marked stable (PR #63924, Filip Skokan). The release also adds WebCrypto cSHAKE (PR #63988), QUIC listEndpoints (PR #63536) and X509Certificate handles (PR #63191), dgram connectSync / bindSync (PRs #63838 + #63932, Guy Bedford), early-TCP net.BoundSocket (PR #63951), an experimental fast FFI call path for AArch64 and x86_64 (PRs #63068 + #63941, Paolo Insogna), npm 11.17.0 (PR #63857), sqlite 3.53.2, and libffi 3.6.0.

Comments

Log in Log in to join the conversation.

No comments yet. Be the first to share your thoughts.