
TypeScript 7.0 RCリリース、Go実装でコンパイル速度10倍に
TypeScript 7.0 RCの概要とインストール方法

TypeScript 7.0 RCの最大の変更点は、コンパイラそのものがGo言語で再実装されたことにある。これまで約10年にわたってTypeScript自身(セルフホスト)で書かれJavaScriptにトランスパイルされてきたコードベースを、Goに移植し直した。ネイティブコードの実行速度と共有メモリによる並列処理によって、コンパイル速度はTypeScript 6.0と比較して約10倍高速化した。
パッケージのインストールは従来と変わらずnpmから行える。以下のコマンドでRelease Candidateを取得し、すぐに試せる。
npm install -D typescript@rcインストール後は npx tsc --version でバージョンを確認できる。7.0.1-rc が表示されれば準備完了だ。コマンドラインの挙動はTypeScript 6.0と変わらず、同じ型チェック結果が得られる。エディタで試すには、VS Code向けに提供されている TypeScript Native Preview 拡張機能 をインストールするとよい。この拡張機能はLanguage Server Protocol(LSP)に基づいており、Copilot CLIを含む多くのエディタで動作する。
既存のTypeScript 6.0との共存
TypeScript 7.0 RCは安定版に近いが、プログラム向けの正式なAPIは少なくとも数か月先のバージョン7.1まで提供されない。このため、TypeScriptチームは6.0と7.0を並行して使い分けられる仕組みを用意した。互換パッケージ @typescript/typescript6 を導入すると、tsc6 という別名のバイナリが利用可能になる。従来のツールチェーンは6.0に固定しつつ、開発中の7.0を試す構成が取れる。
npm install -D typescript@npm:@typescript/typescript6
npm install -D typescript-7@npm:typescript@rcこれにより tsc は7.0を指し、tsc6 は6.0を指す。typescript-eslintのようなピア依存関係を持つツールでも問題なく使い分けられる。ナイトリービルドは現在 @typescript/native-preview パッケージで提供されており、バイナリ名は tsgo となっている。安定版リリース後は typescript パッケージに統合される予定だ。
単一スレッド動作と並列化の制御
TypeScript 7.0では、解析(パース)、型チェック、出力(エミット)の各段階が並列化されている。解析と出力はファイルごとに独立して処理できるため、大規模なコードベースほど効率よくスケールする。一方、型チェックはファイル間の依存関係が複雑で、完全に独立して動かすと計算の重複やメモリ消費が増える。この課題に対処するため、7.0は 固定数の型チェッカーワーカー を立ち上げる仕組みを採用した。デフォルトのワーカー数は4で、--checkers フラグで変更できる。
CIランナーのようにCPUコア数やメモリが限られた環境では、ワーカー数を減らすことでオーバーヘッドを抑えられる。稀に、--checkers の値によって型チェック結果にわずかな順序依存の差異が出る場合がある。チーム間で同じ結果を得るには、明示的にワーカー数を固定しておくのが安全だ。
このデモで示したように、TypeScript 7.0は複数のスレッドを活用して処理を同時に進める。単一スレッドに制限したい場合は --singleThreaded フラグを指定すると、すべての処理を1スレッドで行える。デバッグやパフォーマンス比較に役立つモードだ。
プロジェクト参照ビルドの並列化
TypeScript 7.0はプロジェクト内の並列化に加え、複数のプロジェクト参照を同時にビルドできるようになった。新しい --builders フラグで、並列実行するプロジェクトビルダーの数を制御する。モノレポ構成で多数のプロジェクトを抱える開発環境では、全体のビルド時間をさらに短縮できる可能性が高い。
注意点として、--builders の数と --checkers の数は乗算で効いてくる。たとえば --builders 4 --checkers 4 と指定すると、最大で16個の型チェッカーが同時に動作し、マシンのリソースを圧迫する場合がある。CIランナーやローカル環境のコア数、メモリ容量に応じて適切なバランスを探ることが重要だ。--builders の数値を変えても型チェック結果自体は変わらないが、プロジェクト間の依存グラフがボトルネックになるため、すべてのケースでリニアに速くなるわけではない。
Goへの移植がもたらす互換性と安定性

今回の移植は「スクラッチからの書き直し」ではなく、既存のTypeScript実装を忠実にGoへ移植する手法が取られた。型チェックのロジックはTypeScript 6.0と構造的に同一であり、これまで蓄積してきた膨大なテストスイートをすべてパスしている。Microsoft社内外の数百万行に及ぶコードベースで実際に使われており、高い互換性と安定性を維持している。
Bloomberg、Canva、Figma、Google、Linear、Miro、Notion、Slack、Vercelなど多くの企業がプレリリース版をテストし、ビルド時間の大幅な短縮と軽快な編集体験を報告している。TypeScriptチームはこれらのフィードバックを受け、リリース候補の品質に自信を持っている。
テンプレートリテラル型のUnicode対応改善
TypeScript 7.0では、テンプレートリテラル型におけるUnicodeコードポイントの扱いがより直感的になった。これまではJavaScriptのUTF-16インデックスに従い、サロゲートペアの分割が発生していた。たとえば "😀abc" をテンプレートリテラル型で推論すると、["\ud83d", "\ude00abc"] のように分割されることがあり、意味的に正しくない文字列リテラル型が生成される可能性があった。
7.0では for...of ループやスプレッド構文と同様に、"😀" を1つの単位として扱う。これにより、絵文字や一部の多バイト文字を含む文字列操作がより自然になり、意図しない型エラーを防げる。UTF-16コードユニット単位での操作を前提としていた型レベルユーティリティには破壊的変更となるが、ほとんどのケースで開発者の期待に沿う結果になる。
JavaScriptファイルのサポート見直し
TypeScriptはもともと、JSDocコメントや特定のコードパターンを解析することでJavaScriptファイルの型チェックをサポートしてきた。7.0ではこの動作をTypeScriptファイル(.ts)の解析ロジックとより一貫性のある形に再設計している。一部の旧来のパターンやJSDocタグの解釈が変更され、より厳密な型の扱いが求められるようになった。
たとえば、値が期待される箇所で直接型として値を使う記法は許容されず、typeof someValue と記述する必要がある。@enum タグは特別扱いされない。単独の ? を型として使うこともできず、代わりに any を使う。Closureスタイルの関数シンタックスもサポート対象外となった。詳細な変更点は公式の CHANGES.md ファイルにまとめられている。
改善されたwatchモードとエディタ体験

TypeScript 7.0の --watch モードは、ファイル監視の基盤が全面的に刷新された。新しいファイルウォッチャーは、バンドラのParcelが採用している @parcel/watcher をGoへ移植したものだ。ParcelのウォッチャーはC++で実装されており、ビルドに完全なC++ツールチェーンが必要だったが、今回の移植では最小限のアセンブリシムを併用することで、Goのみで完結する形に仕上げられた。
この移植は、C++からGoへの直接的な翻訳から始まり、最終的にはGoらしいコードへと洗練された。テストスイートも移植され、プラットフォームを問わず安定して動作する。従来のポーリングベースのファイル監視は、大規模プロジェクトで node_modules 以下のファイル変更を監視する際に計算負荷が高かったが、新しいウォッチャーはリソース消費を大幅に抑えている。TypeScriptチームは、VS Codeでの長年の使用実績を持つParcelのウォッチャーをGoでも利用可能にしたことで、エディタとCLIの両方で一貫した高速なファイル監視を実現した。
エディタでの進化とLSP対応
エディタ体験も大きく向上している。VS Code向けのTypeScript Native Preview拡張機能は、LSP(Language Server Protocol)上に構築されており、複数スレッドを活用してリクエストを並列処理する。自動インポート、ホバー情報の展開、インラインヒント、コードレンズ、ソース定義への移動、JSXのリンク編集やタグ補完など、多くの機能が追加された。ベータ版で不足していたセマンティックハイライトや「インポートの並び替え」「未使用インポートの削除」といった機能もRCで組み込まれている。
TypeScriptチームの分析によれば、言語サーバーの失敗コマンド数はTypeScript 6.0と比較して20分の1以下に削減された。GitHub上の主要なTypeScriptおよびJavaScriptコードベースを使ったファズテストを通じて、品質の高さが裏付けられている。
TypeScript 6.0からの移行で注意すべき点

TypeScript 7.0は6.0の型チェック動作と互換性を持つが、6.0で導入された新しいデフォルトや非推奨機能はそのままハードエラーとして扱われる。6.0から7.0への移行をスムーズに進めるために、まず6.0を導入し、非推奨フラグや新しい設定にコードベースを適応させておくことが推奨されている。
以下に主なデフォルト変更点をまとめる。
- strict がデフォルトで
trueになる - module のデフォルトが
esnextになる - target が
esnext直前の安定版ECMAScriptバージョンを指す - noUncheckedSideEffectImports がデフォルトで
trueになる - libReplacement がデフォルトで
falseになる - stableTypeOrdering がデフォルトで
trueになり、無効化できない - rootDir がデフォルトで
./になり、内部のソースディレクトリを明示的に設定する必要がある - types のデフォルトが
[]になり、以前の動作に戻すには["*"]を指定する
rootDir の変更は、tsconfig.json が src のようなディレクトリの外にあるプロジェクトで影響が大きい。include で ./src を指定しつつ、compilerOptions.rootDir に ./src を追加すれば、ディレクトリ構造を維持できる。また、非推奨からハードエラーになった項目として、target: es5 や module: amd, umd, systemjs, none のサポート終了、moduleResolution: node/node10/classic の非サポート化、alwaysStrict の強制などが含まれる。詳細はTypeScript 6.0のリリースブログでも確認できる。
今後のロードマップと安定版リリース

TypeScriptチームは、RCの公開から約1か月以内にTypeScript 7.0の安定版をリリースする計画を立てている。今後はリリース調整やロジスティクス、報告されたリグレッションの修正に注力し、7.1でのAPI機能の拡充にも取り組む。
実際のプロジェクトでTypeScript 7.0を試し、問題があればGitHubの microsoft/typescript-go リポジトリ でフィードバックを送ることが期待されている。TypeScriptチームは、コミュニティのテスト参加によって安定版を万全の状態で届けたいと考えている。フィードバックは、BlueskyやMastodon、Twitterでも受け付けている。
この記事のポイント
- TypeScript 7.0 RCはGo言語で再実装され、コンパイル速度が最大約10倍に向上した
- 既存のTypeScript 6.0と並行して使い分けられる共存パッケージが提供されている
- 並列化機能(–checkers、–builders)により大規模プロジェクトのビルド時間を短縮
- watchモードの刷新とエディタのLSP対応強化で、開発体験全体が高速化された
- 6.0からの移行には、非推奨機能のハードエラー化やデフォルト設定の変更に注意が必要

・ 複数業界における17年間のデジタルビジネス開発経験
・ ウェブサイト開発のためのHTML、PHP、CSS、JavaScript等の実用的知識
・ 15ヶ国語対応の多言語SaaSの開発経験
・ 17年間にも及ぶ、Eコマース長期運営経験
・ 幅広い業界でのSEO最適化の豊富な経験

Node.js 24.16.0 (LTS) 登場、cryptoとテストランナーが大幅進化
2026年5月21日、Node.js 24.16.0(コードネーム Krypton)が長期サポート(LTS)版としてリリースされた。
このバージョンでは、cryptoモジュールへのUUID v7サポート追加、debuggerへの式プローブ機能、HTTPクライアントの安全性強化、テストランナーの大幅な機能拡張など、実務に直結する複数の改善が含まれている。
本記事では、これらの新機能と内部改善を実装例とともに詳しく解説する。
UUID v7がNode.js標準機能に

今回のリリースで最も注目すべき追加機能のひとつが、crypto.randomUUIDv7()の実装だ。UUID v7(Universally Unique Identifier version 7)は、タイムスタンプベースの一意識別子であり、従来広く使われてきたランダムベースのUUID v4とは根本的な設計が異なる。
UUID v7とは何か
UUID v7は、RFC 9562で標準化された新しいUUIDバージョンだ。先頭48ビットにUnixタイムスタンプ(ミリ秒単位)を含み、続いてランダムビットが配置される。この構造により、生成時刻に基づいた自然なソート順が得られる。
データベースのプライマリキーとしてUUIDを使用する場合、v4ではランダムな値のためインデックスの断片化が発生しやすかった。一方、v7では時系列順に並ぶため、B-treeインデックスの効率が大幅に改善する。具体的には、書き込み性能が最大40〜60%向上したとの報告もある。
crypto.randomUUIDv7()の基本的な使い方
Node.js 24.16.0では、以下のようにシンプルに呼び出せる。
const { randomUUIDv7 } = require('node:crypto');
console.log(randomUUIDv7());
// 例: 0193c548-d70c-7a4a-b17b-3c2b12e5c6f1戻り値は標準的なUUID文字列形式(8-4-4-4-12のハイフン区切り)で、第三フィールドの先頭ニブルが7になる点がv7の特徴だ。
従来のv4に代えてv7を採用するメリットを、概念図で整理する。
上の図では、v4の全ランダム性に対して、v7が時刻情報を含む構造であることを対比している。時系列に沿ったINSERT性能が重要なシステムでは、移行を検討する価値がある。
実運用で注意すべき点
UUID v7は時刻情報を含むため、生成時刻が外部に推測される可能性がある。セキュリティ要件が厳しい環境では、この点を評価した上で採用を判断する必要がある。また、時計の巻き戻しが発生するケースでは単調増加性が保証されないため、Node.jsの実装では内部カウンターで対処している。
デバッグ体験を変えるedit-free式プローブ

Node.js 24.16.0では、node inspectコマンドにedit-free runtime expression probesが導入された。これは、デバッグ対象のコードを一切変更することなく、実行時に任意の式を評価できる仕組みだ。
これまでのデバッグ手法との違い
従来、Node.jsアプリケーションの特定の変数の値や式の結果を確認するには、コードにconsole.log()を挿入するか、デバッガでブレークポイントを設定して手動で評価する必要があった。前者はコード改変と再起動を伴い、後者は手動操作の手間が大きい。
式プローブを使えば、稼働中のプロセスに対して外部から評価式を注入できるため、トラブルシュートのスピードが大幅に向上する。特に、再起動が難しい本番環境での障害調査で威力を発揮するだろう。
式プローブの活用シナリオ
たとえば、メモリリークが疑われる長時間稼働プロセスで、特定オブジェクトの参照状況を調査するケースを考えてみる。従来であればヒープダンプの取得と解析が必要だが、式プローブを使えばprocess.memoryUsage()や特定変数の.lengthをその場で評価できる。
この機能の追加は、貢献者のJoyee Cheung氏によるPR #62713に基づいている。V8のインスペクタープロトコルを活用した実装で、Chrome DevToolsのExpression Watchに近い使用感だ。
HTTPクライアントの安全性と利便性の向上

Node.jsのHTTPクライアント機能に、2つの重要な強化が加わった。いずれも実際のプロダクションコードの安全性と記述性に直結する改善だ。
ClientRequestのオプションマージ強化
http.ClientRequestの内部で、ユーザーが渡したオプションとデフォルト値をマージする処理が厳格化された。この変更は、プロトタイプ汚染(Prototype Pollution)攻撃のベクトルを塞ぐことを主眼としている。
プロトタイプ汚染とは、Object.prototypeや__proto__を経由してアプリケーション全体のオブジェクトの振る舞いを改変する攻撃手法だ。Node.jsのHTTPクライアントはリクエストオプションを内部でマージする際、従来はプロトタイプチェーンを適切に処理していなかった。今回のPR #63082で、マージ時にnullプロトタイプオブジェクトを使用するよう修正され、この攻撃経路が遮断された。
Node.jsのMatteo Collina氏が主導したこの修正は、Semver-Minorに分類されているが、セキュリティ上の重要性は高い。とくにユーザー入力からHTTPリクエストオプションを構築するアプリケーションでは、速やかなアップデートが推奨される。
req.signalでリクエスト中断が容易に
もう一つの改善は、http.IncomingMessageへのreq.signalプロパティの追加だ(PR #62541)。これはAbortSignalオブジェクトを提供し、AbortControllerと組み合わせることで、リクエストの中断処理をPromiseベースで簡潔に記述できる。
const controller = new AbortController();
const req = http.request(url, { signal: controller.signal });
req.end();
// 5秒後にタイムアウト
setTimeout(() => controller.abort(), 5000);
req.on('error', (err) => {
if (err.name === 'AbortError') {
console.log('リクエストが中断されました');
}
});従来はreq.destroy()を手動で呼び出す必要があり、後続のエラーハンドリングも煩雑だった。signalパターンの採用により、fetch APIと同じインターフェースで中断処理を統一的に扱えるようになった点が大きい。
テストランナーが実戦的な機能を獲得

Node.jsの組み込みテストランナー(node --test)は、ここ数バージョンで急速に成熟している。24.16.0では、テスト順序のランダム化、モックタイマーのAPI整備、AbortSignal.timeoutのモックサポートという3つの重要な機能が追加された。
テスト順序のランダム化
Pietro Marchini氏によるPR #61747では、テストファイル内のテスト実行順序をランダム化するオプションが導入された。これは、テスト間の暗黙的な依存関係を炙り出すための機能だ。
node --test --test-randomize-order test/*.test.js特定の順序で実行されることを前提に書かれたテストは、ランダム化によって失敗する。これにより、グローバル状態への暗黙の依存や、テスト間のデータ共有の問題を早期に発見できる。テクニックとしては、CIパイプラインにランダム実行を常時組み込むことで、テストスイートの堅牢性を継続的に保証できる。
モックタイマーAPIの拡張
テストランナーのモックタイマー機能が、AbortSignal.timeout()にも対応した(PR #60751)。これにより、タイムアウトに依存する非同期処理のテストが、実際の時間を消費せずに実行できるようになった。
AbortSignal.timeout(5000)を呼び出す実際のタイムアウト時間を待つ必要がなくなるため、数百のテストを含むスイート全体の実行時間を大幅に短縮できる。テストの信頼性も向上し、CIでの不安定なテスト(flaky test)の削減に寄与する。
テストIDとOpenTelemetry対応
さらに、各テストにtestIdが付与され(PR #62772)、TracingChannelを通じたOpenTelemetryインスツルメンテーションとの統合が可能になった(PR #62502)。テストのトレーシング情報を本番系の監視ツールと統合することで、テスト品質の可視化と傾向分析ができるようになる。
ファイルシステムとストリームの機能強化

fsモジュールとストリームモジュールにも、実務のユースケースに即した改善が複数含まれている。
fs.stat()がAbortSignalに対応
Mert Can Altin氏によるPR #57775で、fs.stat()にsignalオプションが追加された。ネットワークファイルシステム上のファイルをstatする際に、応答が遅い場合のタイムアウト制御が可能になる。
import { stat } from 'node:fs/promises';
const ac = new AbortController();
setTimeout(() => ac.abort(), 3000);
try {
const stats = await stat('/mnt/nfs/large-file.dat', { signal: ac.signal });
console.log(stats.size);
} catch (err) {
if (err.name === 'AbortError') {
console.error('statがタイムアウトしました');
}
}これは、HTTPリクエストの中断パターンと同じAPI設計で、Node.js全体で一貫した中断処理のセマンティクスが浸透しつつあることを示している。
statfsのfrsizeフィールド公開
Jinho Jang氏のPR #62277により、statfsの戻り値にfrsize(フラグメントサイズ)フィールドが追加された。これはファイルシステムの最小割り当て単位を示し、ディスク使用量の正確な計算に利用できる。
import { statfs } from 'node:fs/promises';
const s = await statfs('/data');
const actualSize = Math.ceil(fileSize / s.frsize) * s.frsize;
console.log(`実ディスク消費量: ${actualSize} バイト`);これまではbsize(ブロックサイズ)しか公開されておらず、一部のファイルシステム(特にZFSやbtrfs)では正確な計算ができなかった。frsizeの追加により、クロスプラットフォームで信頼性の高いディスク容量の見積もりが可能になる。
duplexPairの破壊伝播の改善
stream.duplexPair()は、読み取り側と書き込み側が対になった2つのDuplexストリームを生成するユーティリティだ。Ahmed Elhor氏のPR #61098によって、片方のストリームが破壊(destroy)された場合に、もう片方にもその破壊が伝播するようになった。
これにより、ソケットの模擬テストやプロキシ処理で、一方のストリームがクローズされたにもかかわらず他方が生き続けてメモリリークを引き起こす問題が解決される。streamモジュールの内部的な一貫性を高める重要な修正だ。
util.styleTextの16進数カラー対応

Guilherme Araújo氏のPR #61556により、util.styleText()に16進数カラーコード(例: #ff5733)の直接指定が可能になった。ターミナル出力のスタイリングにおいて、より繊細な色表現が必要な場面で役立つ。
import { styleText } from 'node:util';
console.log(styleText('#ff5733', '注意: ディスク使用率が90%を超えています'));
console.log(styleText('#4ecdc4', '情報: バックアップが正常に完了しました'));従来はstyleText('red', ...)やstyleText('green', ...)のように、限られた色名しか使えなかった。16進数指定のサポートにより、CIログの色分けやCLIツールのブランドカラー適用など、実務での表現力が格段に向上する。
内部実装としては、ターミナルの24ビットカラー(トゥルーカラー)エスケープシーケンスを使用している。サポートしていないターミナルでは近似の8色にフォールバックされるため、互換性の問題も起きにくい。
この記事のポイント
- Node.js 24.16.0 (LTS) は、crypto.randomUUIDv7()を実装し、データベースのインデックス効率を改善する時系列ソート可能なUUID生成が標準機能になった
- debuggerにedit-free式プローブが追加され、コード修正なしで実行中のプロセスの式評価が可能になった
- HTTPクライアントのオプションマージが強化されプロトタイプ汚染攻撃が防止され、req.signalによるAbortパターンが統一された
- テストランナーでテスト順序ランダム化、モックタイマーのAbortSignal対応、testIdとOpenTelemetry統合が実装された
- fs.stat()へのsignal追加、statfsのfrsize公開、duplexPairの破壊伝播改善など、ファイルシステムとストリームの実用性が向上した
- util.styleText()で16進数カラーコードが直接指定可能になり、CLIツールの色表現力が飛躍的に向上した

・ 複数業界における17年間のデジタルビジネス開発経験
・ ウェブサイト開発のためのHTML、PHP、CSS、JavaScript等の実用的知識
・ 15ヶ国語対応の多言語SaaSの開発経験
・ 17年間にも及ぶ、Eコマース長期運営経験
・ 幅広い業界でのSEO最適化の豊富な経験
