ニュース
» 2020年12月17日 15時00分 公開

新しい型を導入:プログラミング言語「TypeScript 4.1」をMicrosoftが公開

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

[@IT]

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

 Microsoftは2020年11月19日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 4.1」を公開した。さまざまな新機能や新しいチェックフラグが導入され、エディタの生産性を高めるアップデートも施されており、速度も向上している。

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

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

npm install -D typescript

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

テンプレートリテラル型を導入

 テンプレートリテラル型は、テンプレートリテラル表現と同等の型空間だ。テンプレートリテラル表現と同様に、テンプレートリテラル型はバックティックデリミタで閉じられ、「${T}」という形のプレースホルダーを含むことができる。「T」は、「string」や「number」「boolean」「bigint」に代入可能な型を指す。

 テンプレートリテラル型は、リテラル文字列を連結したり、非文字列プリミティブ型のリテラルを文字列表現へ変換したり、文字列の大文字小文字を変換したりできる。さらに、テンプレートリテラル型は型推論により、単純な形式の文字列パターンマッチングと文字列分解も可能だ。

 テンプレートリベラル型は、次のように変換される。

  • プレースホルダー内のユニオン型は、テンプレートリテラル型に分散される

 例えば、`[${A|B|C}]`は、`[${A}]` | `[${B}]` | `[${C}]`に変換される。複数のプレースホルダーに含まれるユニオン型は、クロス積に変換される。例えば、`[${A|B},${C|D}]`は、`[${A},${C}]` | `[${A},${D}]` | `[${B},${C}]` | `[${B},${D}]`に変換される。

  • プレースホルダー内のstring、number、boolean、bigintといったリテラル型は、プレースホルダーをリテラル型の文字列表現に置き換えられる

 例えば、`[${'abc'}]`は`[abc]`に変換され、`[${42}]`は`[42]`に変換される。

  • プレースホルダーに「any」「string」「number」「boolean」「bigint」といった型がある場合は、テンプレートリテラルをstring型に変換される
  • プレースホルダー内に「never」型がある場合は、テンプレートリテラルは「never」に変換される

 幾つかの例を次に示す。

type EventName<T extends string> = `${T}Changed`;
type Concat<S1 extends string, S2 extends string> = `${S1}${S2}`;
type ToString<T extends string | number | boolean | bigint> = `${T}`;
type T0 = EventName<'foo'>;  // 'fooChanged'
type T1 = EventName<'foo' | 'bar' | 'baz'>;  // 'fooChanged' | 'barChanged' | 'bazChanged'
type T2 = Concat<'Hello', 'World'>;  // 'HelloWorld'
type T3 = `${'top' | 'bottom'}-${'left' | 'right'}`;  // 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
type T4 = ToString<'abc' | 42 | true | -1234n>;  // 'abc' | '42' | 'true' | '-1234'

マップ型におけるキーリマッピングに対応

 これまでマップ型は、開発者が提供したキーで新しいオブジェクト型を生成することしかできなかった。だが、入力に基づいて新しいキーを作成したり、キーを除去したりしたい場合も多い。

 そこでTypeScript 4.1では、新しい「as句」によって、マップ型のキーをリマッピングできるようになった。

type MappedTypeWithNewKeys<T> = {
    [K in keyof T as NewKeyType]: T[K]
    //
    //            This is the new syntax!
}

 この新しいas句により、テンプレートリテラル型のような機能を利用して、古いプロパティ名を基にプロパティ名を簡単に作成できるようになった。

type Getters<T> = {
    [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]
};
interface Person {
    name: string;
    age: number;
    location: string;
}
type LazyPerson = Getters<Person>;

 また、neverを作成してキーを除去することも可能だ。つまり、場合によってはOmitヘルパー型を使わずに済む。

// Remove the 'kind' property
type RemoveKindField<T> = {
    [K in keyof T as Exclude<K, "kind">]: T[K]
};
interface Circle {
    kind: "circle";
    radius: number;
}
type KindlessCircle = RemoveKindField<Circle>;
// same as
//   type KindlessCircle = {
//       radius: number;
//   };

再帰的な条件型を作りやすくなった

 TypeScript 4.1では、条件型の一部の制限が緩和された。これにより、条件型が分岐内で自身を直接参照できるようになり、再帰的な型エイリアスを作成しやすくなった。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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