Microsoft、プログラミング言語「TypeScript 3.9」を公開:速度、機能、使い勝手が向上
Microsoftは、オープンソースのプログラミング言語の最新版「TypeScript 3.9」を公開した。コンパイラの高速化やエディタ機能の強化、コーディング支援などの改良が行われている。
Microsoftは2020年5月12日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 3.9」を公開した。
TypeScriptは、静的型付けができる言語で、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。
TypeScript 3.9は、NuGetを使うか、次のコマンドラインのように、npmを使ってインストールできる。
npm install typescript
TypeScript 3.9は「Visual Studio 2019」「Visual Studio 2017」の他、「Visual Studio Code」と「Sublime Text」でも利用できる。TypeScript 3.9の主な特徴は次の通り。
推論とPromise.allの改良
TypeScriptの最近のバージョン(3.7など)では、「Promise.all」や「Promise.race」のような関数の宣言が更新された。だが、これに伴って幾つかの副作用が生じた。特に、nullまたはundefinedの値を組み合わせた場合が顕著だった。
interface Lion { roar(): void } interface Seal { singKissFromARose(): void } async function visitZoo(lionExhibit: Promise<Lion>, sealExhibit: Promise<Seal | undefined>) { let [lion, seal] = await Promise.all([lionExhibit, sealExhibit]); lion.roar(); // uh oh // ‾‾‾‾ // Object is possibly 'undefined'. }
これは奇妙な挙動だ。sealExhibitがundefinedを含むことで、lionの型にundefinedが含まれてしまっている。
TypeScript 3.9では、推論プロセスの改良によってこの問題が解決された。上のようなエラーは発生しなくなっている。
速度の改善
TypeScript 3.9では、速度の改善が多数行われた。「material-ui」や「styled-components」のようなパッケージで編集/コンパイルが極めて遅いことが分かったため、TypeScriptチームはパフォーマンス向上に重点的に取り組んだ。大きな結合、交差、条件型、マップ型に関わる問題がある特定のケースを最適化する一連のプルリクエストにより、踏み込んだ改善を図った。
各プルリクエストの一覧
- Use objects instead of closures for type mappers #36576
- Faster exit from isTypeRelatedTo with identityRelation #36590
- Optimize deferred type references #36607
- Cache results of isGenericObjectType and isGenericIndexType #36622
- Avoid expensive relationship checking in mapped type member resolution #36754
- Reduce intersections by discriminants #36696
各プルリクエストは、特定のコードベースのコンパイル時間を5〜10%程度短縮する。全体として、material-ui-stylesプロジェクトのコンパイル時間が25%程度短縮されたと、TypeScriptチームは考えている。
エディタによるファイル名変更に時間がかかる場合もあったが、この問題も解決された。
//@ts-expect-errorコメント
例えば、TypeScriptでライブラリを作成していて、パブリックAPIの一部として、「doStuff」という関数をエクスポートするとする。この関数の型は、他のTypeScriptユーザーが型チェックエラーを取得できるように、2つの文字列を取ると宣言するが、JavaScriptユーザーに有用なエラーを出力するため、ランタイムチェックも行う(開発ビルドにおいてのみかもしれない)。
function doStuff(abc: string, xyz: string) { assert(typeof abc === "string"); assert(typeof xyz === "string"); // do some stuff }
このため、TypeScriptユーザーはこの関数を誤用すると、有用な赤いチルダとエラーメッセージを取得する。JavaScriptユーザーもアサーションエラーを取得する。この挙動をテストするため、ユニットテストを作成する。
expect(() => { doStuff(123, 456); }).toThrow();
残念ながら、テストをTypeScriptで作成すると、TypeScriptはエラーを提供する。
doStuff(123, 456); // ‾‾‾ // error: Type 'number' is not assignable to type 'string'.
そのため、TypeScript 3.9では、「// @ts-expect-error」コメントという新機能が導入された。行の前に// @ts-expect-errorというコメントを配置すると、TypeScriptは、そうしたエラーの報告を抑制する。だが、エラーがない場合は、// @ts-expect-errorが不要だったと報告する。
簡単な例でいえば、次のコードは問題ない。
// @ts-expect-error console.log(47 * "octopus");
だが、次のコードは、
// @ts-expect-error console.log(1 + 1);
次のエラーを発生させる。
Unused '@ts-expect-error' directive.
条件式での呼び出されない関数のチェック
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Microsoft、プログラミング言語「TypeScript 3.8」のβ版を公開
Microsoftは「TypeScript 3.8」のβ版を公開した。TypeScript 3.8は、ECMAScript規格の新機能や強化機能に加え、型のみのインポート/エクスポートのための新構文など、多くの新機能を提供する。 - 第1回 TypeScriptの概要
Visual Studio 2013 Update 2でのサポートも始まり、altJSの有力候補の1つとして、存在感を増しつつあるTypeScriptの入門連載がスタート! 今回はTypeScriptの概要を解説する。 - 機械学習でMicrosoftがセキュリティバグを判定、高い精度が特徴
Microsoftは、教師あり機械学習を活用することにより、セキュリティバグの特定と分類の精度を大幅に向上させたと発表した。開発時、さらには運用後の改善にはセキュリティ専門家の協力を仰ぐことが不可欠なのだという。