プログラミング言語「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」フラグが用意された。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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