Microsoftは、オープンソースのプログラミング言語の最新版「TypeScript 4.2」を公開した。多くの機能が強化され、パフォーマンスも向上している。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Microsoftは2021年2月23日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 4.2」を公開した。さまざまな新しい機能が追加され、生産性やパフォーマンスも向上している。
TypeScriptは静的型付けができる言語であり、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。
NuGetを使うか、次のコマンドラインのように、npmを使ってTypeScript 4.2をインストールできる。
npm install typescript
TypeScript 4.2は「Visual Studio 2019」と「Visual Studio 2017」のエディタでサポートされており、「Visual Studio Code」(以下、VS Code)、「Sublime Text 3」でも利用できる。TypeScript 4.2の主な特徴は次の通り。
TypeScriptには型の新しい名前を型エイリアスとして宣言する方法がある。TypeScript 4.2は内部機構が改良された結果、型が最初にどのように作成され、構成されたのかを部分的に保持しながら、型の構成を追跡するようになった。さらに、型エイリアスを追跡し、他のエイリアスのインスタンスと区別することも可能になった。
そのおかげで、型がコードでどのように使われているかに基づいて、型を出力できるようになった。この改善の結果、意図しなかった巨大な型が表示されることを回避できる。多くの場合、.d.tsファイル出力や、エラーメッセージ、エディタ内でのクイック情報やシグネチャヘルプにおける型表示の改善につながる。
タプル型におけるrest要素の使い方が拡張された結果、幾つかの制限を守る限り、rest要素をタプル内のどこにでも置けるようになった。
let foo: [...string[], number]; foo = [123]; foo = ["hello", 123]; foo = ["hello!", "hello!", "hello!", 123]; let bar: [boolean, ...string[], boolean]; bar = [true, false]; bar = [true, "some text", false]; bar = [true, "some", "separated", "text", false]; rest要素の配置の制限は、「rest要素の後にオプション要素やrest要素が続いてはならない」というものだ。 interface Clown { /*...*/ } interface Joker { /*...*/ } let StealersWheel: [...Clown[], "me", ...Joker[]]; // ~~~~~~~~~~ Error! // A rest element cannot follow another rest element. let StringsAndMaybeBoolean: [...string[], boolean?]; // ~~~~~~~~ Error! // An optional element cannot follow a rest element.
JavaScriptではin演算子の右に非オブジェクト型を置くと、ランタイムエラーになる。TypeScript 4.2では設計時にこの問題を捕捉できるようになった。
"foo" in 42 // ~~ // error! The right-hand side of an 'in' expression must not be a primitive.
TypeScriptには既にインデックスシグネチャが導入されている。そのため、まず「person["name"]」のようなかっこ付きの要素アクセス構文が、続いて「person.name」のようなドット付きのプロパティアクセス構文が使えるようになったが、いずれも一長一短があった。TypeScript 4.2では、これらを柔軟に利用できるように、「--noPropertyAccessFromIndexSignatur」eという新しいフラグが導入された。
コンストラクタシグネチャにabstract修飾子を指定できるようになった。
interface HasArea { getArea(): number; } // Works! let Ctor: abstract new () => HasArea = Shape; // ^^^^^^^^
コンストラクトシグネチャへabstract修飾子を追加した結果、abstractコンストラクタを渡せるようになった。ただし、「具体的な」他のクラス/コンストラクタ関数を渡せないというわけではない。TypeScript 4.2でabstract修飾子を追加できるようになった理由は、コンストラクタを直接実行する意図がないことを示すだけであるため、どちらのクラス型も安全に渡せる。
この機能は、abstractクラスをサポートするようにmixinファクトリーを作成できるようにする。例えば、次のコードスニペットでは、mixin関数のwithStylesをabstractクラスのSuperClassとともに使用できる。
abstract class SuperClass { abstract someMethod(): void; badda() {} } type AbstractConstructor<T> = abstract new (...args: any[]) => T function withStyles<T extends AbstractConstructor<object>>(Ctor: T) { abstract class StyledClass extends Ctor { getStyles() { // ... } } return StyledClass; } class SubClass extends withStyles(SuperClass) { someMethod() { this.someMethod() } }
TypeScript 4.2では、「--explainFiles」フラグが用意された。
tsc --explainFiles
このオプションを使うと、TypeScriptコンパイラは、ファイルがプログラムに含まれる理由を示す詳細な出力を生成する。この出力をファイルに書き込むか、あるいは見やすく表示できる他のプログラムにパイプで渡せば、読みやすくなる。
# Forward output to a text file tsc --explainFiles > expanation.txt # Pipe output to a utility program like `less`, or an editor like VS Code tsc --explainFiles | less tsc --explainFiles | code -
出力は通常、プログラムにlib.d.tsファイルが含まれる理由をまず一覧表示し、続いてローカルファイルが含まれる理由、さらにnode_modulesファイルが含まれる理由を表示する。
TS_Compiler_Directory/4.2.2/lib/lib.es5.d.ts Library referenced via 'es5' from file 'TS_Compiler_Directory/4.2.2/lib/lib.es2015.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.es2015.d.ts Library referenced via 'es2015' from file 'TS_Compiler_Directory/4.2.2/lib/lib.es2016.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.es2016.d.ts Library referenced via 'es2016' from file 'TS_Compiler_Directory/4.2.2/lib/lib.es2017.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.es2017.d.ts Library referenced via 'es2017' from file 'TS_Compiler_Directory/4.2.2/lib/lib.es2018.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.es2018.d.ts Library referenced via 'es2018' from file 'TS_Compiler_Directory/4.2.2/lib/lib.es2019.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.es2019.d.ts Library referenced via 'es2019' from file 'TS_Compiler_Directory/4.2.2/lib/lib.es2020.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.es2020.d.ts Library referenced via 'es2020' from file 'TS_Compiler_Directory/4.2.2/lib/lib.esnext.d.ts' TS_Compiler_Directory/4.2.2/lib/lib.esnext.d.ts Library 'lib.esnext.d.ts' specified in compilerOptions ... More Library References... foo.ts Matched by include pattern '**/*' in 'tsconfig.json'
TypeScript 4.2では、呼び出されない関数のチェックが「&&式」および「||式」内にも適用されるようになった。
「--strictNullChecks」の下では、次のコードはエラーになる。
function shouldDisplayElement(element: Element) { // ... return true; } function getVisibleItems(elements: Element[]) { return elements.filter(e => shouldDisplayElement && e.children.length) // ~~~~~~~~~~~~~~~~~~~~ // This condition will always return true since the function is always defined. // Did you mean to call it instead. }
非構造化変数を、先頭にアンダースコア(_)を付けることで、使用しないことをマークできるようになった。
let [_first, second] = getValues();
関数やメソッドが見つからない場合、コールサイトに基づいて、これらを新たに宣言して素早く修正できるようになった。
Copyright © ITmedia, Inc. All Rights Reserved.