Skip to main content

Command Palette

Search for a command to run...

I'm porting tsc to Go

Updated
3 min read

I’m porting tsc to Go

I’m porting the TypeScript Type Checker tsc to Go, and not Rust. As the creator of SWC, an extensible Rust platform, this might sound strange. Let me explain.

Why port tsc?

As TypeScript continues to rise in adoption, large projects are facing a dilemma: type checking is one of the slowest parts of their workflow. Developers want type safety without the tradeoff of slower iteration cycles.

The TypeScript Compiler, or tsc, checks the validity of your types and compiles your code to JavaScript. The more code you have, the longer it takes to compile. On medium-to-large-sized TypeScript projects, this compilation is extremely slow. While developers can replace the transpilation part of their workflow with SWC, type checking has still been a bottleneck.

What is a type checker?

A type checker validates your program before execution and ensures you've used correct values for function calls and variable assignments. To prevent you from specifying types everywhere, it also infers variable types whenever possible. Type checking helps you develop with confidence, prevent mistakes, and enables smoother refactoring of large codebases.

Why not Rust?

I tried to rewrite tsc in Rust. It started as a side project and was a lot of fun. I started recreating the type checking logic without looking at the tsc source code.

Early tests of my Rust rewrite showed 62x faster type checking than tsc. To measure the compile-time between SWC and tsc, I used the conformance test suite from the official TypeScript compiler. Here were the results (using 8 threads):

  • tsc: 133.2 seconds
  • Rust rewrite: 2.13 seconds (62x faster)

Eventually, I realized that rewriting a massive project such as tsc would be extremely difficult to continue. But the performance gains were exciting. This led me to try another route: porting instead of a complete rewrite. So, I started looking at the TypeScript source code.

tsc uses a lot of shared mutability and many parts depend on garbage collection. Even though I’m an advocate and believer in Rust, it doesn’t feel like the right tool for the job here. Using Rust required me to use unsafe too much for this specific project.

tsc depends on shared mutability and has a cyclical mutable reference. Rust is designed to prevent this behavior. Having two references to the same data (shared mutability) is undefined behavior in Rust.

Your language choice should be determined by the task, and not by preference. So even though I love Rust, I started experimenting with Go and Zig for this project and chose to use Go.

Will it be open-source?

Vercel is sponsoring and funding the work to port tsc to Go. We’re planning to open-source this work in the future. I’ll also be creating a bridge to use this new version of tsc with SWC.

With type checking support, SWC is working to improve the performance of your entire JavaScript / TypeScript toolchain:

  • ✅ Transpilation (replacing Babel)
  • 🚧 Type Checking (replacing tsc)
  • 🚧 Minification (replacing Terser)
  • 🚧 Bundling (replacing webpack)

For project updates, follow me on Twitter.

More from this blog

한국의 학벌에 대한 생각

내 블로그의 제목이 kdy1: The way I think 인만큼 앞으로는 내 생각을 더 자주 올리려고 한다. 한국 기준으로, 학벌은 사람을 볼 때 꽤나 유용한 지표이지만, 절대적이지는 않다. 경험적인 얘기일 뿐이지만, 성균관대학교 자퇴생으로서 느낀 것들이 몇 가지 있다. 대학까지 간 사람의 학벌은 학습 능력 x 성실함 에 대체로 비례한다. 그래서 의미가

Apr 3, 20261 min read

인간 지능에 대한 메모장

최종 업데이트: 2026/03/15 지능의 유전 현재 인류 기준으로, 고지능자는 고지능 유전자가 많이 겹친 사람이다. 지능의 유전엔 X 염색체가 매우 중요한 역할을 한다. 그리고 이게 남자와 여자의 지능 분포 차이를 만든다. 극상위권에 여자가 거의 없는 이유가 이것이다. 고지능 X 염색체가 여자한테서 발현되려면 2개가 있어야 한다. 이는 인간의 생

Mar 15, 20262 min read

Ai 코딩 팁 2 (한국어)

발표 자료: https://gamma.app/docs/AI--2a52e7tk3eb1ch1 AI 활용법 관련해서 간단하게 발표를 했다. 발표 자료 앞쪽은 전에 블로그에 올린 글이랑 같은 내용이다. 이 글에서는 기존 글에서 다루지 않은 내용들을 다루겠다. 에러 메시지 및 로깅 구체적 타입 및 스키마 활용 any 타입은 사람에게도 위험하지만, AI에게는 더 위험하다. 마찬가지로, JSON.parse처럼 아무 제약 없는 파싱 느슨한 인터페이스 ...

Jan 30, 20265 min read

kdy1: The way I think

233 posts