検索
ニュース

プログラミング言語「TypeScript 4.3」をMicrosoftが公開インポート文の入力補完が利用可能に

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

Share
Tweet
LINE
Hatena

 Microsoftは2021年5月26日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 4.3」を公開した。多くの新しい機能の導入や機能改善が行われ、生産性やパフォーマンスも向上している。

 TypeScriptは静的型付けができる言語であり、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。

 NuGetを使うか、次のコマンドラインのように、npmを使ってTypeScript 4.3をインストールできる。

npm install typescript

 TypeScript 4.3は「Visual Studio 2019」と「Visual Studio 2017」のエディタでサポートされており、「Visual Studio Code」(以下、VS Code)、「Sublime Text 3」でも利用できる。TypeScript 4.3の主な特徴は次の通り。

getterとsetterに別の型を指定可能に

 プロパティの読み取りと書き込みの型を指定できるようになり、getterとsetterのペアが異なる型を取れるようになった。これらの型はクラスやオブジェクトリテラル、インタフェース、オブジェクト型で別々に指定できる。

const thing = {
    _size: 0,
    get size(): number {
        return this._size;
    },
    set size(value: string | number) {
        this._size = typeof value === 'string' ? parseInt(value) : value;
    }
}
// OK
thing.size = "100ish";
// OK
console.log(thing.size.toFixed(2));

 この新機能には、「getterの型はsetterに割り当て可能でなければならない」という制限がある。これにより、一定の一貫性が確保され、プロパティは常に、自身への割り当てが可能になる。

「override」キーワードと「--noImplicitOverride」フラグが利用可能に

 「override」キーワードと「--noImplicitOverride」フラグが導入された。overrideキーワードは、クラスメソッドが基底クラスのメソッドをオーバーライドすることを示す。--noImplicitOverrideフラグが有効になっている場合、明示的にoverrideキーワードを使っていない限り、スーパークラスのメソッドをオーバーライドすると、エラーになる。

 次のサンプルでは、--noImplicitOverrideフラグが有効になっていると、エラーになる。これは、「Derived」内のメソッドの名前を変える必要があることを示唆している。

class Base {
    someHelperMethod() {
        // ...
    }
}
class Derived extends Base {
    // Oops! We weren't trying to override here,
    // we just needed to write a local helper method.
    someHelperMethod() {
        // ...
    }
}

テンプレートリテラル型同士の関係と推論をサポート

 テンプレートリテラル型同士の関係と推論がサポートされた。型関係のターゲット側がテンプレートリテラル型である場合、ソース側は互換性のあるテンプレートリテラル型であることが可能だ。同様に、テンプレートリテラルターゲット型に推論する場合、ソース型もテンプレートリテラル型であることが可能だ。

 改善された代入関係の例を次に示す。

declare let s1: `${number}-${number}-${number}`;
declare let s2: `1-2-3`;
declare let s3: `${number}-2-3`;
declare let s4: `1-${number}-3`;
declare let s5: `1-2-${number}`;
declare let s6: `${number}-2-${number}`;
s1 = s2;
s1 = s3;
s1 = s4;
s1 = s5;
s1 = s6;

 これまでは最初の代入だけが可能だったが、例にある全ての代入が可能になった。

 テンプレートリテラル型同士の推論の例を次に示す。

declare function foo1<V extends string>(arg: `*${V}*`): V;
function test<T extends string>(s: string, n: number, b: boolean, t: T) {
    let x1 = foo('*hello*');  // "hello"
    let x2 = foo('**hello**');  // "*hello*"
    let x3 = foo(`*${s}*` as const);  // string
    let x4 = foo(`*${n}*` as const);  // `${number}`
    let x5 = foo(`*${b}*` as const);  // "true" | "false"
    let x6 = foo(`*${t}*` as const);  // `${T}`
    let x7 = foo(`**${s}**` as const);  // `*${string}*`
}

コンテキストで型付けされたテンプレートリテラル式がテンプレートリテラル型に

 コンテキストで型付けされたテンプレートリテラル式のためにテンプレートリテラル型が導入された。具体的には次のような場合に、テンプレートリテラル式にテンプレートリテラル型が与えられる。

  • テンプレートリテラル式が文字列リテラル型またはテンプレートリテラル型によってコンテキストで型付けされている場合
  • テンプレートリテラル式がstring型に割り当て可能な制約を持つ汎用(はんよう)型によってコンテキストで型付けされ、望ましいのはテンプレートリテラル型だと明らかなシナリオで、as constを使用する必要性を軽減する場合

 この抑制的なアプローチにより、破壊的変更が発生せず、下位互換性が確保される。次に例を示す。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る