プログラミング言語「TypeScript 4.2」をMicrosoftが公開スマートな型エイリアス保存が可能に

Microsoftは、オープンソースのプログラミング言語の最新版「TypeScript 4.2」を公開した。多くの機能が強化され、パフォーマンスも向上している。

» 2021年03月01日 17時00分 公開
[@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 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要素の使い方が拡張された結果、幾つかの制限を守る限り、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.

in演算子のチェックが厳格化

 JavaScriptではin演算子の右に非オブジェクト型を置くと、ランタイムエラーになる。TypeScript 4.2では設計時にこの問題を捕捉できるようになった。

"foo" in 42
//       ~~
// error! The right-hand side of an 'in' expression must not be a primitive.

--noPropertyAccessFromIndexSignatureフラグが利用可能に

 TypeScriptには既にインデックスシグネチャが導入されている。そのため、まず「person["name"]」のようなかっこ付きの要素アクセス構文が、続いて「person.name」のようなドット付きのプロパティアクセス構文が使えるようになったが、いずれも一長一短があった。TypeScript 4.2では、これらを柔軟に利用できるように、「--noPropertyAccessFromIndexSignatur」eという新しいフラグが導入された。

コンストラクタシグネチャにabstract修飾子が指定可能に

 コンストラクタシグネチャに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()
    }
}

プロジェクト構造の理解に役立つ「--explainFiles」が利用可能に

 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();

見つからないヘルパー関数の宣言

 関数やメソッドが見つからない場合、コールサイトに基づいて、これらを新たに宣言して素早く修正できるようになった。

見つからない関数やメソッドを素早く修正できる(出典:Microsoft、クリックで再生)

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。