検索
ニュース

Microsoft、「TypeScript 5.7」β版を公開 相対パスの書き換えなど新機能を追加未初期化変数のチェックや設定ファイルの探索も改善

Microsoftは、オープンソースのプログラミング言語の最新版「TypeScript 5.7」のβ版を公開した。

Share
Tweet
LINE
Hatena

 Microsoftは2024年10月9日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 5.7」のβ版を公開した。

 TypeScriptは、静的型付けができる言語で、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。

 TypeScript 5.7 β版は以下のnpmコマンドでインストールできる。


(提供:Microsoft)

 TypeScript 5.7 β版は機能的に安定しており、1カ月余りでリリース候補板(RC)が公開され、その後間もなく安定版がリリースされる予定だ。

TypeScript 5.7の主な機能強化点

初期化されていない変数のチェック

 TypeScriptは以前から、変数が初期化されていない問題を検出できるが、この機能がうまく働かない場合もある。例えば、変数が別の関数でアクセスされる場合、型システムはその関数がいつ呼び出されるか分からないものの、変数が初期化されるという「楽観的」な見方をする。

 TypeScript 5.7は、初期化されている可能性のある変数にはまだ甘いものの、変数が全く初期化されていない場合は、型システムがエラーを報告できるようになった。


(提供:Microsoft)

相対パスの書き換え

 TypeScriptのコードを“インプレースで”実行できる(出力JavaScriptファイルを生成するビルドステップが不要な)ツールやランタイムが幾つかある。例えば、ts-node、tsx、Deno、Bunは、.tsファイルの直接実行をサポートしており、Node.jsでもこれに向けて取り組んでいる。

 これらのツール全てと最大限の互換性を保つには、“インプレースで”インポートされたTypeScriptファイルは、実行時に適切なTypeScript拡張子でインポートされなければならない。

 TypeScriptは、「--allowImportingTsExtensions」というコンパイラオプションでこうしたインポートをサポートしてきたが、これらの.tsファイルから.jsファイルを生成する必要がある場合を考慮し、「--rewriteRelativeImportExtensions」という新しいコンパイラオプションが追加された。

 これにより、インポートパスが相対パス(./または./で始まる)であり、TypeScript拡張子(.ts、.tsx、.mts、.cts)で終わり、非宣言ファイルである場合、コンパイラはパスを、対応するJavaScript拡張子(.js、.jsx、.mjs、.cjs)に書き換えるようになった。


(提供:Microsoft)

 その結果、インプレースで実行され、準備ができたらJavaScriptにコンパイルされるTypeScriptコードを作成できるようになった。

--target es2024と--lib es2024のサポート

 「--target es2024」がサポートされ、ユーザーは「ECMAScript 2024」のランタイムをターゲットにできるようになった。このターゲットでは、新しい「--lib es2024」を指定できる。--lib es2024は、「SharedArrayBuffer」と「ArrayBuffer」「Object.groupBy」、「Map.groupBy」「Promise.withResolvers」などの多くの機能を含んでいる。

 また、「Atomics.waitAsync」が「-lib es2022」から-lib es2024に移動した。

プロジェクトの設定ファイルの探索

 「TSServer」を使用するエディタ(「Visual Studio」や「Visual Studio Code」など)でTypeScriptファイルがロードされると、エディタは、そのファイルを「所有している」関連する「tsconfig.json」ファイルを見つけようとする。具体的には、編集中のファイルからディレクトリツリーをたどり、tsconfig.jsonファイルを探す。

 これまでこの探索は、最初に見つかったtsconfig.jsonファイルで止まっていた。だが、次のようなプロジェクト構造では、foo-test.tsを編集する際に、エディタは「project/src/tsconfig.json」を、「所有する」設定ファイルとして誤認してしまうという問題があった。これを回避する唯一の方法は、src/tsconfig.jsonを「src/tsconfig.src.json」のように名称変更することだった。こうすることで、エディタは、全てのプロジェクトを参照する最上位階層のtsconfig.jsonを見つけられる。


(提供:Microsoft)

 TypeScript 5.7は、開発者がこうした作業をせずに済むように、エディタシナリオに合ったtsconfig.jsonファイルを見つけるまで、ディレクトリツリーをたどり続けるようになった。そのため、プロジェクトの構成や設定ファイルをより柔軟に配置できるようになる。

コンポジットプロジェクトにおける所属関係のチェックの高速化

 以下のような構造を持つ大規模なコードベースがあるとする。


(提供:Microsoft)

 packagesの各ディレクトリは個別のTypeScriptプロジェクトであり、appディレクトリは、他の全てのプロジェクトに依存するメインプロジェクトだ。


(提供:Microsoft)

 appディレクトリにあるsome-script.jsをエディタで開くと、TypeScript言語サービス(JavaScriptファイルのエディタ体験も扱う)は、適切な設定を適用できるように、このファイルがどのプロジェクトに属しているかを把握する必要がある。

 この場合、一番近いtsconfig.jsonにはsome-script.jsが含まれていないが、TypeScriptは、「app/tsconfig.jsonが参照するプロジェクトのどれかにsome-script.jsが含まれている可能性があるか」を知ろうとする。そのために、TypeScriptはこれまで、some-script.jsを含むプロジェクトを見つけるまで、各プロジェクトを1つずつロードし、プロジェクトのルートファイルセットだけでなく、プロジェクト内の全てのファイルを解析していた。

 だが、大規模なコードベースでは、この動作が極端で予測不可能な挙動を引き起こす場合があった。

 幸い、他の(ワークスペースではない)プロジェクトから参照可能なプロジェクトは全て、コンポジットというフラグを有効にしなければならない。このフラグは、「全ての入力ソースファイルがあらかじめ既知でなければならない」というルールを強制する。そこでTypeScript 5.7では、コンポジットプロジェクトを調査する際、ファイルがそのプロジェクトのルートファイルセットに属するかどうかだけをチェックするようになった。

--module nodenextにおけるJSONインポートの検証

 「--module nodenext」で.jsonファイルからインポートする場合、TypeScriptは実行時のエラーを防ぐために、特定のルールを強制するようになった。

 その1つは、「JSONファイルのインポートには、『type: "json"』を含むインポート属性が必要」というものだ。

import myConfig from "./myConfig.json";
//                   ~~~~~~~~~~~~~~~~~
//  エラー:「'module'」が「'NodeNext'」に設定されている場合、JSONファイルをECMAScriptモジュールにインポートするには、「type: "json"」インポート属性が必要
import myConfig from "./myConfig.json" with { type: "json" };
//                                          ^^^^^^^^^^^^^^^^
//  これは問題ない。「type: "json"」が提供されているため

 またTypeScriptは、名前が指定されたエクスポートを生成せず、JSONインポートの内容にはデフォルトでしかアクセスできない。


(提供:Microsoft)

Node.jsにおけるV8コンパイルキャッシングのサポート

 Node.js 22は、「module.enableCompileCache()」という新しいAPIをサポートしている。このAPIにより、ランタイムはツールの最初の実行後の解析とコンパイルの作業の一部を再利用できる。

 TypeScript 5.7はこのAPIを利用して、有用な作業をより早く開始できるようになった。テストでは、「tsc --version」を実行することで、約2.5倍の高速化が見られた。


(提供:Microsoft)

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る