先日2025/03/11に、A 10x Faster TypeScriptという記事が公開されました。
TypeScriptの処理系をGoで書き直すことによって速度が10倍向上するとのことです。
ロードマップとしては、TypeScript5.x系は現状のJSベースであり、6.xは移行のために一部互換性のない変更が入り、そして7.0で完全移行の予定ということでした。
そして2025/05/22、その最初のプレビュー版が公開されました。
以下は公式ブログから該当記事、Announcing TypeScript Native Previewsの紹介です。
Announcing TypeScript Native Previews
今年3月、TypeScriptコンパイラとツールセットをネイティブコードに移植することを発表しました。
ネイティブ言語と並列処理、同時実行などの活用により、ほとんどのコードで10倍の高速化を実現しました。
その後、大規模で複雑な現実世界でのプロジェクトへの適用に向けて、多くの進歩を遂げてきました。
TypeScript Nativeのプレビュー版を公開できることをうれしく思います。
本日より、TypeScriptのコンパイラをnpmで入手することができるようになります。
またVisual Studio Marketplaceより、VS Code用エディタのプレビュー版も利用できます。
npmでコンパイラを入手するには、以下のコマンドを実行してください。
npm install -D @typescript/native-preview
このパッケージはtsgo
という実行ファイルを生成します。
これは既存の実行ファイルtsc
と同じように動作することができます。
npx tsgo --project ./src/tsconfig.json
現時点ではテストを容易にするため別ファイルとして生成されますが、最終的にはtsgo
ではなくtsc
を生成するようになります。
新しい実行ファイルはまだテスト中ですが、多くのプロジェクトにおいて型チェックとビルドに成功しています。
コマンドラインのコンパイラだけでは不十分であることは承知しており、そのためVisual Studio Codeに新たな『TypeScript (Native Preview)』拡張機能を用意しました。
マーケットプレイスからインストール可能です。
この拡張機能はまだ開発初期段階であるため、ビルトインのTypeScript拡張機能に依存しています。
そのためインストール後に手動で有効化する必要があります。
コマンドパレットから『TypeScript Native Preview: Enable (Experimental)』を実行してください。
もしくは設定ファイルに以下を追加します。
"typescript.experimental.useTsgo": true,
Updates, Release Cadence, and Roadmap
更新はTypeScript 7 nightlyに毎日公開されるため、TypeScript nativeの最新機能を簡単に試すことができます。
VS Code拡張機能を使っている場合は更新が自動適用されます。
何らかの不具合が起きた場合は、Issueを報告し、『TypeScript Native Preview: Disable』コマンドでサービスを一時停止しましょう。
プレビュー版には、現在のTypeScript安定板に存在する多くの機能が不足していることに注意してください。
たとえば--build
・--declaration
、一部のダウンレベルトランスパイルなどです。
また自動インポート、参照の検索、リネームといったエディタ機能もまだできていません。
鋭意開発中なので時々チェックすることをお勧めします。
What’s New?
最初の発表以来、型チェック、テスト、エディタ、APIなどに目覚ましい進歩を遂げてきました。
これまでの成果と、今後の展望について最新情報をお伝えします。
最終的にはTypeScript 7という名前になりますが、これまでは"Project Corsa"と呼んでいました。
また現在のTypeScript 5.8コードベースは"Strada"と呼んでいました。
従って我々は、ネイティブバージョンCorsaと、JavaScriptバージョンStradaのアップデートを区別しています。
Fuller Type-Checking Support
型チェックの完全なサポート
型チェッカーは大部分が既に移植済みです。
すなわち、型の順序の意図的変更や、lib.d.ts
の古い定義に依存するプロジェクトを除き、全てのプロジェクトで同じエラーが発生するはずです。
ちがいが出たときは、ぜひ報告してください。
最初の発表以降に追加された主要な機能について、個別に言及しておく価値はあるでしょう。
JSX Checking Support
開発者が初めてTypeScript nativeにアクセスしたとき、落胆したかもしれません。
型チェックはまだ完全ではなく、多くの開発者にとって最も大きな欠陥はJSXでした。
CorsaはJSXの解析はできましたが、JSXの型チェックはできず、まだサポートしていないという通知を出していました。
その後我々はJSXの型チェックを実装し、JSXのビルドがどれだけ高速化するか把握できるようになりました。
コードベースの例としてSentryを見てみましょう。
TypeScript 5.8で--extendedDiagnostics --noEmit
すると、以下のような結果になります。
$ tsc -p . --noEmit --extendedDiagnostics
Files: 9306
Lines of Library: 43159
Lines of Definitions: 352182
Lines of TypeScript: 1113969
Lines of JavaScript: 1106
Lines of JSON: 304
Lines of Other: 0
Identifiers: 1956007
Symbols: 3563371
Types: 999619
Instantiations: 3675199
Memory used: 3356832K
Assignability cache size: 944737
Identity cache size: 43226
Subtype cache size: 110171
Strict subtype cache size: 430338
I/O Read time: 1.40s
Parse time: 3.48s
ResolveModule time: 1.88s
ResolveTypeReference time: 0.02s
ResolveLibrary time: 0.01s
Program time: 7.78s
Bind time: 1.77s
Check time: 63.26s
printTime time: 0.00s
Emit time: 0.00s
Total time: 72.81s
1分以上かかりました。
TypeScript Nativeでどうなるか見てみましょう。
$ tsgo -p . --noEmit --extendedDiagnostics
...
Files: 9292
Lines: 1508361
Identifiers: 1954236
Symbols: 5011565
Types: 1689528
Instantiations: 6524885
Memory used: 3892267K
Memory allocs: 61043466
Parse time: 0.712s
Bind time: 0.133s
Check time: 5.882s
Emit time: 0.012s
Total time: 6.761s
同一のマシンで、ビルド時間が1分から7秒になりました。
環境によって結果が異なる可能性はありますが、この例では10倍の高速化に成功しています。
JSXに意図的にエラーを埋め込んでみると、tsgoはもちろんそれを検知します。
JSXの型サポートの詳細についてはプルリクエストを参照ください。
またtslibとJSX factoryのインポートもご覧ください。
JavaScript Checking
TypeScriptは、JavaScriptの解析と型チェックもサポートしています。
JavaScript/ECMAScriptは型構文をサポートしていないため、かわりにソースコード内のJSDocコメントを参照します。
TypeScript Nativeも、JavaScriptの型チェックをサポートしました。
型チェック機能の開発にあたっては、実装方針の検討を行いました。
既存のJavaScriptサポートは非常に"organicに"構築されており、結果として、ほとんど使用されていない、あるいは全く使用されていないであろう非常に特殊なパターンが存在します。
新しいコードベースは"simplify"を保つため、既存コードの移植ではなく新たに書き起こされました。
そのため、一部の構文は書き直しが必要になる可能性があります。
これが原因でプロジェクトに支障をきたす場合、フィードバックをください。
Editor Support & LSP Progress
エディタサポート、LSPの進捗状況。
最初にCorsaをリリースした時点では、Language Serverサポートは非常に基本的なものだけでした。
開発リソースの大部分はコンパイラに向けられていましたが、エディタ機能のためにLSPへの作業も進められてきました。
StradaのコードベースはLSPより前から存在していたTSServer形式であるため、完全な互換を目指しているわけではありません。
つまり、コードの移植には多くの手作業が必要ということであり、LSPに準拠するために事前により多くの検討が必要になりました。
エラー、分析、定義への移動、ホバーは初期段階から実装されていました。
最近、新たなマイルストーンを達成しました。
補完機能がサポートされたのです。
まだ完全に移植されたわけではありませんが、大規模なコードベースの開発では十分有用な機能になるでしょう。
今後は既存のテストスイートの移植に加え、参照の検索、名前の変更、シグネチャの有効化などに対応します。
API Progress
APIの移植における大きな課題は、TypeScriptのAPI consumerとの互換性です。
標準I/Oを使うAPIレイヤの初期基盤はすでに構築されています。
すなわち、API consumerは何の言語を使っているかに関わらずIPCを通じてTypeScriptとやりとりができます。
多くのAPI consumerはTypeScriptとJavaScriptを使うだろうと思われるので、JavaScriptのクライアントを用意しています。
多くのTypeScript APIは同期なので、プロセス通信も同期で行いたいところです。
しかし残念ながら、Node.jsでは子プロセスと同期通信する簡単な方法が用意されていません。
そこで、同期通信を行うRust製Node.jsモジュールlibsyncrpcを開発しました。
きっとみんな喜んでくれるでしょう。
APIの設計はまだ初期段階ですが、意見やフィードバックをお待ちしています。
現在の進捗についてはこちらをご覧ください。
Known and Notable Differences
既知の差異。
前述のとおり、Corsaの動作はStradaと異なる可能性があります。
ちがいの多くは、TypeScript 6.0で廃止される機能、たとえばnode10を優先する、などに起因します。
--moduleResolution node
や--module commonjs
を実行すると以下のようなエラーになります。
Cannot find module 'blah' or its corresponding type declarations.
Module '"module"' has no exported member 'Thing'.
tsconfig.json
の設定も同じです。
{
"compilerOptions": {
// ...
"module": "preserve",
"moduleResolution": "bundler",
}
}
これらは必要に応じて手動で書き換えることもできますが、多くの場合は単にインポートを削除し、自動インポートにすることでうまくいくでしょう。
また非推奨以外にも古いターゲットへの出力は制限されています。
JSXは有効な記述を保てるバージョンまで出力可能です。
What’s Next?
今年後半までに、--build
など主要な機能と、エディタ向けの言語機能を備えた、より完成度の高いコンパイラの提供を目指しています。
しかし、みなさんはそこまで待つ必要はありません。
TypeScript Native Previewは毎夜提供され、また主要な開発状況については定期的に情報を提供していく予定です。
ぜひTypeScript Nativeのプレビューをお試しください!
Happy Hacking!
感想
素のJavaScriptであれば保存した次の瞬間にはブラウザで動作確認できるのに、TypeScriptではわざわざ保存してから変換待ちのコーヒータイムを取らされるという50年前みたいなコーディングを強制させられていました。
まあTypeScriptにかぎらずフロントエンド全般が抱える宿業ではありますが。
その負担が大幅に軽減されるということで、たいへん喜ばしい更新ですね。
TypeScrtipt7が降ってくるのはまだ先のことですが、既に先行してお試しできるみたいなので、ぜひともその威力を体験してみてはいかがでしょうか。