maxfie1d のブログ

マイクロソフト系技術ネタを中心に書きます。

TypeScript 2.7 がリリースされました

TypeScript 2.7 がリリースされました。

機能一覧

セルフ翻訳なのであまり信用しないでください。

  • Stricter class property checks (より厳格なクラスプロパティのチェック)
  • Definite assignment assertions (明確な代入アサーション)
  • Easier ECMAScript module interoperability (より簡単になったECMAScriptモジュールとの相互運用)
  • unique symbol types and const-named properties (unique symbol型と定数名プロパティ)
  • Cleaner output in --watch mode (--watchモードでの出力の整理)
  • Prettier --pretty output (より美しくなった--pretty出力)
  • Numeric Separators (数値セパレータ)
  • Fixed Length Tuples (固定長タプル)
  • in operator narrowing and accurate instanceof (inによる一種のタイプガードと正確なinstanceof)
  • Smarter object literal inference (よりスマートになったオブジェクトリテラルの推論)

盛りだくさんの修正が入っています。 少しだけ詳しく説明します。

Unique symbol types

これが一番ややこしくて、合っているか自信がありませんが...

まず ES2015 から追加された Symbol を知っておく必要があります。 こちらのQiitaの記事が分かりやすく詳しいです。

qiita.com

ごくごく簡単に言ってしまえば、Symbolconstreadonly staticで受けるとき unique symbolというものになります。

// これはOK
declare const Foo: unique symbol;

// unique symbol なのに const で受けてないのでエラー
let Bar: unique symbol = Symbol();

// これはOK。既存の unique symbol を参照する時は typeof を使う
let Baz: typeof Foo = Foo;

// これもOK
class C {
    static readonly StaticSymbol: unique symbol = Symbol();
}

また各々のunique symbol は完全に独立しているので、 2つの unique symbol を代入したり比較したりすることはできません。

const Foo = Symbol();
const Bar = Symbol();

// 2つの unique symbol を比較することはできないのでエラー
if (Foo === Bar) {
    // ...
}

Numeric separators

数値をアンダーバーで区切ることで見やすく書けるアレです。 TypeScript でも使えるようになりました! ビット列やバイト列で使うととても便利です。

let bits = 0b0010_1010;
let routine = 0xC0FFEE_F00D_BED;
let martin = 0xF0_1E;

in operator narroing

in オペレータを、あるプロパティがオブジェクトに存在していれば trueを返すものとして使えるようになります。

以下の例は TypeScript のリポジトリでこの機能が提案された時のものですが。 if の条件式が 'x' in q となっていて、もしqの型がAならばxをプロパティに持つので trueを返し、qの型がBならば xをプロパティに持たない(代わりにyをプロパティに持っているが)ので falseを返すことになります。

interface A {
  x: number;
}
interface B {
  y: string;
}

let q: A | B = ...;
if ('x' in q) {
  // q: A
} else {
  // q: B
}