検索
ニュース

Microsoft、プログラミング言語「TypeScript 5.4」を公開非推奨のオプションを利用するコードは次期バージョンまでに移行が必要

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

Share
Tweet
LINE
Hatena

 Microsoftは2024年3月6日(米国時間、以下同)、オープンソースのプログラミング言語の最新版「TypeScript 5.4」を公開した。TypeScriptは、静的型付けができる言語で、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。

 TypeScript 5.4では、最後の代入に続くクロージャによる型の絞り込みの保持、ユーティリティー型「NoInfer」の導入、「Object.groupBy」と「Map.groupBy」の宣言の追加など、さまざまな機能追加、改善が行われている。

 TypeScript 5.4は、NuGetかnpmコマンドでインストールできる。

npm install -D typescript
npmでのインストールコマンド

TypeScript 5.4の主な新機能

最後の代入に続くクロージャによる型の絞り込みの保持

 TypeScriptは通常、実行される可能性のあるチェックに基づいて、変数の型を絞り込むことができる。だが、絞り込まれた型が関数クロージャ内で保持されるとは限らないという問題があった。

 TypeScript 5.4では、ホイストされていない関数でパラメーターやlet変数が使われている場合、型チェッカーは最後の代入箇所を探し、見つかれば、TypeScriptが関数外から安全に型を絞り込めるようになった。

型を絞り込むサンプルコード(提供:Microsoft)
型を絞り込むサンプルコード(提供:Microsoft)

ユーティリティー型「NoInfer」

 TypeScriptはジェネリック関数を呼び出すとき、渡されたものから型の引数を推測できる。だが、最適な型が何かは必ずしも明確ではない。

 TypeScript 5.4では、ユーティリティー型「NoInfer」が導入された。NoInfer<...>で型を囲むことで、TypeScriptに対して「型推測の候補を見つけるために内部の型を掘り下げて照合しないように」というシグナルを送ることができる。

「Object.groupBy」と「Map.groupBy」

 JavaScriptの新しい静的メソッドである「Object.groupBy」と「Map.groupBy」の宣言が追加された。

 Object.groupByはイテレート可能な要素と、各要素をどの「グループ」に入れるかを決定する関数を取る。この関数は、各グループの「キー」を作る必要があり、Object.groupByはそのキーを使って、各キーが元の要素を含む配列にマップされるオブジェクトを作る。

 つまり、

Object.groupByの使用例(提供:Microsoft)
Object.groupByの使用例(提供:Microsoft)

 上記のJavaScriptは基本的に、下記と同じだ。

evenとoddのプロパティを持つmyObjオブジェクト(提供:Microsoft)
evenとoddのプロパティを持つmyObjオブジェクト(提供:Microsoft)

 Map.groupByはObject.groupByと似ているが、プレーンなオブジェクトの代わりにMapを生成する。

Map.groupByの使用例(提供:Microsoft)
Map.groupByの使用例(提供:Microsoft)

 上記のmyObjは、以前と同様に下記のように作成することも可能だ。

(提供:Microsoft)
(提供:Microsoft)

 Microsoftは「Mapの保証が必要な場合や、Mapを期待するAPIを扱っている場合、JavaScriptのプロパティ名として使えるキーだけでなく、任意のキーをグループ化に使う必要がある場合は、Map.groupByの方が望ましいかもしれない」と述べている。

--moduleResolution bundlerと--module preserveでのrequire()呼び出しのサポート

 TypeScriptには、bundlerというmoduleResolutionオプションがあるが、このオプションの制限の一つは、-module esnextと組み合わせなければならないため、import ... = require(...)という構文が使えないことだった。

 TypeScript 5.4では、preserveという新しいオプションでmodule設定を行う際に、require()が使えるようになった。

インポート属性とアサーションのチェック

 インポート属性とアサーションが、グローバルなImportAttributes型に対してチェックされるようになった。これにより、ランタイムがインポート属性をより正確に記述できるようになった。

ImportAttributesの使用例(提供:Microsoft)
ImportAttributesの使用例(提供:Microsoft)

不足しているパラメーターを追加するクイックフィックス

 引数が多すぎる関数に新しいパラメーターを追加するクイックフィックスが導入された。

(上)someFunctionがsomeHelperFunctionを、想定より2つ多い引数で呼び出しているので、クイックフィックスが提供される。(下)クイックフィックスが適用され、不足しているパラメーターがsomeHelperFunctionに追加されている(提供:Microsoft)
(上)someFunctionがsomeHelperFunctionを、想定より2つ多い引数で呼び出しているので、クイックフィックスが提供される。(下)クイックフィックスが適用され、不足しているパラメーターがsomeHelperFunctionに追加されている(提供:Microsoft)

 これは、新しい引数を複数の既存の関数に通す場合に便利だ。

自動インポート機能がサブパスインポートをサポート

 Node.jsのpackage.jsonは、「importss」というフィールドで「サブパスインポート」機能をサポートしている。これは、パッケージ内のパスを他のモジュールのパスに再マッピングする方法だ。TypeScriptの自動インポート機能はこれまで、インポート時にパスを考慮しなかったが、新たにサブパスインポートをサポートするようになった。

TypeScript 5.0の非推奨事項は、コードの移行が必要に

 TypeScript 5.0では、以下のオプションと動作が非推奨となった。

  • charset
  • target: ES3
  • importsNotUsedAsValues
  • noImplicitUseStrict
  • noStrictGenericChecks
  • keyofStringsOnly
  • suppressExcessPropertyErrors
  • suppressImplicitAnyIndexErrors
  • out
  • preserveValueImports
  • プロジェクト参照でのprepend
  • 暗黙的にOS固有のnewLine

 これらを使い続けるには、TypeScript 5.0以降を使用する開発者は、ignoreDeprecationsという新しいオプションを「5.0」という値で指定する必要があった。TypScript 5.4は、これらが正常に機能し続ける最後のバージョンとなる。TypeScript 5.5(2024年6月にリリースされる見込み)では、これらはハードエラーとなり、これらを使用しているコードは移行する必要がある。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る