Microsoftは、オープンソースのプログラミング言語の最新版「TypeScript 4.0」を公開した。多数の機能強化が行われ、パフォーマンスも向上している。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Microsoftは2020年8月20日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 4.0」を公開した。表現性、生産性、スケーラビリティを強化した次世代TypeScriptとうたっている。
TypeScriptは、静的型付けができる言語で、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。
TypeScript 4.0は、2018年7月に公開されたTypeScript 3.0以来のメジャーリリース。Microsoftは、npmでTypeScriptの月間ダウンロード数が2020年7月に初めて5000万を超えたことや、開発者向けQ&Aサイト「Stack Overflow」による2020年の年次開発者調査において、最も愛されている言語のランキングでTypeScriptが2位を占めたことを引き合いに出し(首位はRust)、TypeScriptの普及が進んでいることを強調した。
TypeScript 4.0は、NuGetを使うか、次のコマンドラインのように、npmを使ってインストールできる。
npm install -D typescript
TypeScript 4.0は「Visual Studio 2019」「Visual Studio 2017」のエディタでサポートされており、「Visual Studio Code」(以下、VS Code)でも利用できる。TypeScript 4.0の主な特徴は次の通り。
操作対象の実際の型が分からなくても、タプルと配列の高次操作を表現できるようになった。
また、次のように、残りの要素をタプルの最後だけでなく、タプル内のどこにでも発生させることが可能になった。
type Strings = [string, string]; type Numbers = [number, number]; // [string, string, number, number, boolean] type StrStrNumNumBool = [...Strings, ...Numbers, boolean];
タプル型がラベルを提供できるようになった。
type Range = [start: number, end: number];
パラメーターリストとタプル型のつながりを深めるため、残りの要素およびオプション要素の構文は、パラメーターリストの構文を反映したものになる。
type Foo = [first: number, second?: string, ...rest: any[]];
ラベル付きタプルは、タプルと引数リストのパターンを利用するとともに、型安全な方法でオーバーロードを実装するときに便利だ。
「noImplicitAny」が有効な場合に、制御フロー分析によってクラスのプロパティの型を決定できるようになった。
class Square { // Previously: implicit any! // Now: inferred to `number`! area; sideLength; constructor(sideLength: number) { this.sideLength = sideLength; this.area = sideLength ** 2; } }
新たにECMAScriptの3つの代入演算子「&&=」「||=」「??=」をサポートした。
これらの代入演算子は、次のようなコードを書くときに代わりに使える。
a = a && b; a = a || b; a = a ?? b;
また、次のようなifブロックを書くときにも使える。
// could be 'a ||= b' if (!a) { a = b; }
catch句の変数の型として、「any」の代わりに「unknown」を指定できるようになった。unknownはanyよりも安全だ。値を操作する前に、何らかの型チェックを行う必要があることを思い出させるからだ。
try { // ... } catch (e: unknown) { // error! // Property 'toUpperCase' does not exist on type 'unknown'. console.log(e.toUpperCase()); if (typeof e === "string") { // works! // We've narrowed 'e' down to the type 'string'. console.log(e.toUpperCase()); } }
新しい「jsxFragmentFactory」オプションを使ってフラグメントファクトリをカスタマイズできるようになった。
例えば、次の「tsconfig.json」ファイルはTypeScriptに、Reactと互換性を持つようにJSXを変換するよう指示しているが、各ファクトリ呼び出しを「React.createElement」ではなく「h」に切り替え、「React.Fragment」の代わりに「Fragment」を使用する。
{ "compilerOptions": { "target": "esnext", "module": "commonjs", "jsx": "react", "jsxFactory": "h", "jsxFragmentFactory": "Fragment" } }
これまでは、「--noEmitOnError」フラグを使う場合、コンパイルエラーになった後でプログラムを「--incremental」でコンパイルすると、極めて低速になっていた。前回のコンパイルの情報が、「--noEmitOnError」フラグに基づいて「.tsbuildinfo」ファイルにキャッシュされていなかったからだ。
TypeScript 4.0では、このシナリオで大幅にスピードが向上し、「--build」モードシナリオ(--incrementalと--noEmitOnErrorの両方を含む)も改善された。
--incrementalコンパイル時に「--noEmit」フラグを使用できるようになった。これは従来、不可能だった。--incrementalが.tsbuildinfoファイルを出力する必要があるからだ。だが、高速な差分ビルドを実現するユースケースが重要なことから、全てのユーザー向けにこうしたフラグ使用が可能になった。
オプショナルチェイニングやnullish coalescingを利用できるように一般的なパターンを変換する、新しいリファクタリングが可能になった。
TypeScriptのエディタ支援機能は、宣言が「/** @deprecated */」というJSDocコメントでマークされていると、認識するようになった。VS Codeのようなエディタでは通常、非推奨となった値がこのように取り消し線で表示される。
大規模プロジェクトなどで起動に時間がかかるというユーザーの声が多かったことを受け、部分的なセマンティックモードが導入された。このモードを選択すると、起動してから数秒で編集中のファイルが扱えるようになり、プロジェクト全体はバックグラウンドでロードされる。
今のところ、このモードはVS CodeのInsiders版でのみサポートされている。
エディタ支援機能において、ユーザーが「package.json」の「dependencies」(と「peerDependencies」)フィールドに指定したパッケージの情報が、自動インポート機能の向上のために使われるようになった。これにより、高いコストがかかる「node_modules」パッケージの完全な探索を行うことなく、型を持つ依存関係を全て自動インポートすることが可能になった。
TypeScript Webサイトが最近刷新されたことも紹介された。
Copyright © ITmedia, Inc. All Rights Reserved.