TypeScript2.7がリリース

TypeScript2.7が現地時間2月1日にリリースされました。
主な変更点は以下となります。
- Stricter class property checks
- Definite assignment assertions
- Easier ECMAScript module interoperability
- unique symbol types and const-named properties
- Cleaner output in –watch mode
- Prettier –pretty output
- Numeric Separators
- Fixed Length Tuples
- in operator narrowing and accurate instanceof
- Smarter object literal inference
今回のリリースで個人的に注目なのは
- Stricter class property checks
- Easier ECMAScript module interoperability
- Numeric Separators
- in operator narrowing and accurate instanceof
の4点
Stricter class property checks
簡単に言うと厳格モード。
「–strictPropertyInitialization」を追加することによって、クラスの各インスタンスプロパティがコンストラクタ本体に設定されるか、プロパティ初期化子によって設定しないとエラーになります。
例文は以下
class C {
foo: number;
bar = "hello";
baz: boolean;
// ~~~
// Error! Property 'baz' has no initializer and is not assigned directly in the constructor.
constructor() {
this.foo = 42;
}
}
Easier ECMAScript module interoperability
ES2015でECMAScriptモジュールが標準化される前は、JavaScriptエコシステムにはいくつかの異なるモジュール形式があったことは知っている人もいるはず。
ES2015から標準化されたはいいが、ここで問題が起こりました。
それは「レガシー」な資産、もといレガシーなモジュール形式との相互運用ですね。
実際、過去のモジュールを使おうとするとTypescriptの型定義ファイルを持ってくる必要がありました。
それが以下のようにあたかも元からあったモジュールの様な振る舞いで呼び出すことが可能になります。
import express from "express";
let app = express();
Numeric Separators
これはまぁカンマやドット区切りの部分に「_」をつけることによって見やすくなった形です。
今まで
const milion = 1000000;
typescript2.7から
const milion = 1_000_000;
うむ、可読性がアップ
in operator narrowing and accurate instanceof
今までJSの型チェックは「instanceof」を使っていました。
function MyClass() {}
var obj = new MyClass();
obj instanceof MyClass; // true
obj instanceof Array; // false
それが以下の様にinでチェックが行えるようになります。
スマート。
interface A { a: number };
interface B { b: string };
function foo(x: A | B) {
if ("a" in x) {
return x.a;
}
return x.b;
}
まとめ
と、まぁ今回は結構大きな変更がありました。
レガシー資産を気兼ねなく使える様になるのは大きい。
詳細は以下ページに書いてあるのでご覧あれ!
ちなみに全部英語ダヨ
Posted by YamamotoDaiki