Microsoft、プログラミング言語「TypeScript 3.8」のβ版を公開2020年2月に正式リリース予定

Microsoftは「TypeScript 3.8」のβ版を公開した。TypeScript 3.8は、ECMAScript規格の新機能や強化機能に加え、型のみのインポート/エクスポートのための新構文など、多くの新機能を提供する。

» 2020年01月15日 18時00分 公開
[@IT]

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

 Microsoftは2020年1月10日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 3.8」のβ版を公開した。このβ版には、2020年2月にリリース予定の正式版が提供する新機能を全て搭載した。

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

 TypeScript 3.8のβ版は、NuGetを使うか、次のコマンドラインのように、npmを使ってインストールできる(β版であるため、「@beta」が必要)。

npm install typescript @ beta

 TypeScript 3.8は「Visual Studio 2019」「Visual Studio 2017」の他、「Visual Studio Code」と「Sublime Text」でも利用できる。TypeScript 3.8の主な特徴は次の通り。

型のみのインポートとエクスポートに対応、分かりやすいコード記述を助ける

 TypeScript 3.8では、インポートとエクスポートをユーザーがよりきめ細かく制御できるように、型のみのインポート、エクスポートのための新しい構文を導入した。

import type { SomeThing } from "./some-module.js";
export type { SomeThing };

 「import type」は、型の注釈と宣言のみをインポートする。実行時には常時完全に消去されるので、何も残らない。同様に、「export type」は、型コンテキストに使えるエクスポートのみを提供し、TypeScriptの出力からは消去される。

 クラスには実行時の値と設計時の型がある。import typeを使用してクラスをインポートする場合、クラスからの拡張などはできない。

ECMAScriptのプライベートフィールドに対応

 TypeScript 3.8は、ステージ3のクラスフィールド提案が含むECMAScriptのプライベートフィールドをサポートする。

class Person {
    #name: string
    
    constructor(name: string) {
        this.#name = name;
    }
    greet() {
        console.log(`Hello, my name is ${this.#name}!`);
    }
}
let jeremy = new Person("Jeremy Bearimy");
jeremy.#name
//     ~~~~~
// Property '#name' is not accessible outside class 'Person'
// because it has a private identifier.

 通常のプロパティ(プライベート修飾子で宣言されたものも含む)とは異なり、プライベートフィールドには、留意しなくてはならない幾つかのルールがある。主なものは次の通り。

  • プライベートフィールドは、「#」で始まる。「プライベートネーム」と呼ばれる場合もある
  • 全てのプライベートフィールド名は、そのフィールドを含むクラスにおいてのみ有効。publicやprivateなどのTypeScriptアクセシビリティー修飾子は、privateフィールドでは使用できない
  • プライベートフィールドは、それを含むクラスの外部からはアクセスできず、検知することもできない

export * as ns構文を導入、広く使われているコードパターンに対応

 他のモジュールの全メンバーを単一のメンバーとしてエクスポーズする単一のエントリポイントが広く使われている。

import * as utilities from "./utilities.js";
export { utilities };

 このため、ECMAScript 2020は最近、このパターンをサポートする新しい構文を追加した。

export * as utilities from "./utilities.js";

 これはJavaScriptの改良として有用であり、TypeScript 3.8もこの構文を実装した。モジュールターゲットがECMAScript 2020より前のバージョンである場合、TypeScriptは、最初のコードスニペットの行に従って出力する。

トップレベルawaitを導入して同期処理を補完

 TypeScript 3.8では、ECMAScriptに導入予定の「トップレベルawait」という便利な機能が使えるようになった。

 これまでJavaScriptでは(同様の機能を持つ他の大半の言語と同様に)、awaitは、async関数の本体内でのみ使用できた。トップレベルawait機能では、モジュールのトップレベルでawaitを使用できる。

const response = await fetch("...");
const greeting = await response.text();
console.log(greeting);
// Make sure we're a module
export {};

JSDocプロパティ修飾子を導入、型チェックを強化

 allowJsフラグを有効にすることで、TypeScript 3.8はJavaScriptファイルをサポートする。さらに、checkJsオプションによって、あるいは.jsファイルの先頭に「// @ts-check」コメントを追加することで、こうしたJavaScriptファイルの型チェックをサポートする。

 JavaScriptファイルには専用の型チェック構文がないため、TypeScriptはJSDocを利用する。TypeScript 3.8は、JSDocの幾つかの新しいプロパティタグを認識する。例えば、アクセシビリティー修飾子の@publicや@private、@protectedだ。これらのタグは、それぞれTypeScriptでpublic、private、protectedと同様に機能する。

// @ts-check
class Foo {
    constructor() {
        /** @private */
        this.stuff = 100;
    }
    printStuff() {
        console.log(this.stuff);
    }
}
new Foo().stuff;
//        ~~~~~
// error! Property 'stuff' is private and only accessible within class 'Foo'.

 @publicは常に暗黙的に指定され、省略もできるが、プロパティにはどこからでもアクセスでる。@privateは、プロパティを含むクラス内でのみ使用できることを意味する。@protectedは、プロパティが含まれるクラスと全ての派生サブクラス内でのみ使用でき、含まれるクラスの異なるインスタンスでは使用できないことを意味する。

 さらに、プロパティが初期化時にのみ書き込まれるように、@readonly修飾子も追加した。

// @ts-check
class Foo {
    constructor() {
        /** @readonly */
        this.stuff = 100;
    }
    writeToStuff() {
        this.stuff = 200;
        //   ~~~~~
        // Cannot assign to 'stuff' because it is a read-only property.
    }
}
new Foo().stuff++;
//        ~~~~~
// Cannot assign to 'stuff' because it is a read-only property.

ファイル監視機構をwatchOptions導入で改善

 TypeScriptでは何年もの間、「--watch」モードやエディタによって信頼性の高いファイル監視機構を提供しようと努めており、大部分はうまくいっているが、Node.js対応には困難が伴っていた。

 このため、TypeScript 3.8ではtsconfig.jsonとjsconfig.jsonに新しい「watchOptions」フィールドを導入した。ユーザーはこのフィールドによってコンパイラ/言語サービスに、どの監視戦略を用いてファイルやディレクトリを追跡すべきかを指示できる。

{
    // Some typical compiler options
    "compilerOptions": {
        "target": "es2020",
        "moduleResolution": "node",
        // ...
    },
    // NEW: Options for file/directory watching
    "watchOptions": {
        // Use native file system events for files and directories
        "watchFile": "useFsEvents",
        "watchDirectory": "useFsEvents",
        // Poll files for updates more frequently
        // when they're updated a lot.
        "fallbackPolling": "dynamicPriority"
    }
}

“高速で緩やかな”差分チェックを導入

 TypeScript 3.8では、「assumeChangesOnlyAffectDirectDependencies」という新しいコンパイラオプションを導入した。このオプションを有効にすると、TypeScriptは、影響を受ける可能性がある全ファイルの再チェック/再ビルドを回避し、変更されたファイルと、それらのファイルを直接インポートするファイルについてのみ、再チェック/再ビルドを行う。

 Visual Studio Codeを利用した場合、この差分チェックによって特定のファイルの変更に対する再構築時間が約14秒から約1秒に短縮できた。

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のメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。