Closed4

TypeScript Native Previewsを試してみる

まさきちまさきち

TypeScript Native Previews

2025年5月23日にMicrosoftのTypeScriptチームは、TypeScriptのGo言語実装によるコンパイラのプレビュー版「TypeScript Native Previews」を公開

https://devblogs.microsoft.com/typescript/typescript-native-port/

https://devblogs.microsoft.com/typescript/announcing-typescript-native-previews/


ざっくりと概要

プロジェクトの大規模化に伴い、ビルド時間や型チェック時間の長さが課題となっていた。
Go 言語で TypeScript コンパイラを再実装するプロジェクトが進められている。将来的にTypeScript7(現在、TypeScript 5.9)でtscコマンドを置き換えることを目指している

2025年半ばまでにコマンドライン型チェックに対応したネイティブ実装のプレビュー版を公開し、年末までにプロジェクトビルド向けの機能完備のソリューションと言語サービスを提供できる予定
出典:https://devblogs.microsoft.com/typescript/typescript-native-port/

単にGoというネイティブコンパイル言語を利用するだけでなく、共有メモリ並列処理や並行処理を最大限に活用することで、多くのプロジェクトでビルド時間を高速化することを目標としている。
最終的に公式パッケージ typescript に統合し、tsc → tsgo に置き換えがされる

公式発表によると、tsgoを使用することで型チェックやコンパイル速度が最大で10倍向上するとのこと。

ベース 行数 tsc (TypeScript 6.x) 所要時間 tsgo (TypeScript 7 preview) 所要時間 高速化倍率
VS Code 1,505,000 77.8 秒 7.5 秒 約 10.4 倍
Playwright 356,000 11.1 秒 1.1 秒 約 10.1 倍
RxJS 2,100 1.1 秒 0.1 秒 約 11 倍
TypeORM 270,000 17.5 秒 1.3 秒 約 13.5 倍

出典: https://devblogs.microsoft.com/typescript/typescript-native-port/

https://github.com/microsoft/typescript-go/issues



To meet those goals, we’ve begun work on a native port of the TypeScript compiler and tools.

今回は書き直し(中身のロジック・アルゴリズムを再設計しながら新言語で実装し直すこと)ではなく移植(できるだけ元のコード構造・アルゴリズムを保ったまま言語を置き換えること、コピーに近い)

例)

TypeScriptの場合

interface Node {
  kind: string;
  children: Node[];
}

// 子を追加する処理
function addChild(parent: Node, child: Node) {
  parent.children.push(child);
}


goの場合

type Node struct {
    Kind     string
    Children []*Node
}

// 子を追加する処理
func (n *Node) AddChild(child *Node) {
    n.Children = append(n.Children, child)
}

JSのコード構造をほぼそのまま移植できる。Rustの場合、所有権を考える必要がある。
「既存実装をできるだけ崩さず速くしたい」目的でGoが最適


まさきちまさきち

現行コンパイラの構成

現在、TypeScript コンパイラ(tsc)は、TypeScriptで実装されており、Node.js 上で動作する。TypeScriptはセルフホスティング型であり、TypeScript で書かれた TypeScript コンパイラが、自分自身をコンパイルしている。
現在の流れ、tscを実行 → Node.js が TypeScript で書かれた .ts ファイルを一度 JavaScript に変換 → 型チェックや出力処理を実行



「TypeScript Native」では何が変わるのか?

項目 tsc (旧) tsgo (新)
実装言語 TypeScript Go
実行環境 Node.js ネイティブバイナリ(クロスプラットフォーム)
配布形式 npm npm + バイナリ

※ Goのgoroutineを使用してTypeScript のAST(構文木)の生成や型推論などの複数ファイルで並列処理を実施している模様
※ Nodeと違って、Goネイティブの単体バイナリで起動時間が小さい。大規模プロジェクトの読み込みや型チェックの総時間が大幅短縮

tsc(Node.js 実装)の場合

  1. Nodeを起動 → V8 エンジンの初期化、GC の仕組み、モジュールローダーなどをセットアップ
  2. JavaScript 実装のパース → Node.js が立ち上がるまでの固定コストがある。

tsgo(Go 実装)の場合

  1. Go でビルドされたネイティブバイナリを直接実行できる → V8 の初期化も Node.js モジュール解決も不要。
  2. Go の実行バイナリは OS が読み込み可能

→ つまり、余計な初期化に時間を食わず、バイナリ直実行でほぼ即コンパイルに入れる


まさきちまさきち

tsgoを試す際のセットアップ

npm パッケージ(@typescript/native-preview) で公開されており、tsgoコマンドで呼び出し可能
--buildといったビルド/出力オプションなし、自動インポート、すべての参照の検索、名前の変更といったエディター機能もまだ実装待ち

npm install -D @typescript/native-preview


バージョン確認

npx tsgo -v
Version 7.0.0-dev.20250720.1

環境構築

npm install -D typescript
npx tsc --init
{
  "compilerOptions": {
    "target": "esnext",
    "lib": ["esnext", "dom", "dom.iterable"],
    "module": "NodeNext",
    "strict": true,
    "skipLibCheck": true
  }
}

tsgo を使って型チェックも可能

npx tsgo --project ./tsconfig.json

VS Code 拡張をインストールし、「TypeScript (Native Preview)」を有効化することも可能


まさきちまさきち

速度比較

ある程度の規模のTypeScriptコードをtscとtsgoでコンパイルし、その速度を比較してみる。
infer, conditional typesなどを多用しており、100ファイル以上存在する中規模のプロジェクトで実施してみる。

鹿野さんの記事に記載されているリポジトリを参照する。

https://zenn.dev/ubie_dev/articles/typescript7-tsgo-whatsnew


TypeScriptの多様な機能(インターフェイス、クラス、型エイリアス、ジェネリクス、列挙型、型ガードーなど)を盛り込んだ架空のECサイトのバックエンド処理をシミュレートするTypeScriptコード

https://github.com/tonkotsuboy/tsgo-playground


npx tsc -p . --extendedDiagnosticsnpx tsgo -p . --extendedDiagnosticsでコンパイルを実施それぞれ比較してみる。

tscの場合

Files:                         83
Lines of Library:           53140
Lines of Definitions:           0
Lines of TypeScript:          741
Lines of JavaScript:            0
Lines of JSON:                  0
Lines of Other:                 0
Identifiers:                48369
Symbols:                    32283
Types:                       1204
Instantiations:              1471
Memory used:               64825K
Assignability cache size:     232
Identity cache size:            9
Subtype cache size:            27
Strict subtype cache size:      1
I/O Read time:              0.02s
Parse time:                 0.34s
ResolveLibrary time:        0.02s
Program time:               0.42s
Bind time:                  0.11s
Check time:                 0.22s
transformTime time:         0.02s
commentTime time:           0.01s
I/O Write time:             0.00s
printTime time:             0.09s
Emit time:                  0.09s
Total time:                 0.84s


tsgoの場合

Files:              81
Lines:           43900
Identifiers:     47823
Symbols:         33118
Types:            1504
Instantiations:   1650
Memory used:    24869K
Memory allocs:   57313
Config time:    0.002s
Parse time:     0.064s
Bind time:      0.016s
Check time:     0.051s
Emit time:      0.008s
Total time:     0.157s


結果は以下の通り

計測項目 tsc (旧) tsgo (新) 高速化倍率
合計処理時間 (Total time) 0.84s 0.157s 5.35倍
型チェック時間 (Check time) 0.22s 0.051s 4.31倍
メモリ使用量 (Memory used) 64825K 24869K 2.61倍

コードの規模が大きくなればもっと伸びる。

このスクラップは14日前にクローズされました