44
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TypeScript v3.3.0-rc 変更点

Posted at

こんにちはメルペイ社@vvakameです。

TypeScript 3.3 RCがアナウンスされました。

What's new in TypeScriptも更新されています。
v3.3.0では破壊的変更は存在しない予定です。エライ!

この辺に僕が試した時のコードを投げてあります。

変更点まとめ

破壊的変更!

なし! えらい!

関数などの呼び出し時にunion typesが絡む場合の挙動を改善

call signatureを持つ型同士でunion typesを構成した時、引数の型についてintersection typesを使った評価がされるようになりました。
何を言っているかわからないと思いますが要するに下のコードみたいなことが行われるようになりました。

type Fruit = "apple" | "orange";
type Color = "red" | "orange";

type FruitEater = (fruit: Fruit) => number;     // eats and ranks the fruit
type ColorConsumer = (color: Color) => string;  // consumes and describes the colors

declare let f: FruitEater | ColorConsumer;

// 今まではコレはダメだった。3.3以降はOK!
// error TS2349: Cannot invoke an expression whose type lacks a call signature.
//   Type 'FruitEater | ColorConsumer' has no compatible call signatures.
f("orange");
// 次の2つはNG 共通の引数ではないので
// error TS2345: Argument of type '"apple"' is not assignable to parameter of type '"orange"'.
// f("apple");
// error TS2345: Argument of type '"red"' is not assignable to parameter of type '"orange"'.
// f("red");

// TypeScript 3.3以降、次のように引数の型が評価される(はず)
type f_0 = (arg: Parameters<FruitEater>[0] & Parameters<ColorConsumer>[0]) => ReturnType<FruitEater> | ReturnType<ColorConsumer>;
// とりあえず展開できるところを普通に展開
type f_1 = (arg: Fruit & Color) => number | string;
// さらに展開
type f_2 = (arg: ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange")) => number | string;
// 成立しえない部分は never になる
type f_3 = (arg: (never) | (never) | (never) | ("orange")) => number | string;
// そして "orange" だけが残った
type f_4 = (arg: "orange") => number | string;

実際これが役に立つシチュエーションはちょっと想像しにくいですね…。
なにかのパーサーとか…?

ちなみに、construct signatureにも適用できるようです。

type Fruit = "apple" | "orange";
type Color = "red" | "orange";

interface FruitConstructor {
    new(arg: Fruit): { fruit: string };
}
interface ColorConstructor {
    new(arg: Color): { color: Color };
}

declare let Ctor: FruitConstructor | ColorConstructor;
let obj = new Ctor("orange");

--build--watch でインクリメンタルビルドがサポートされた

そのまんまです。

--build以前紹介したように、プロジェクト間の参照があるような場合に一括でビルドするためのコマンドです。

昔から -b-w の併用はできたんですが、なにか変更があるたびにフルビルドしていました。
ビルダAPIに新しくインクリメンタルビルド用のAPIを作り、内部的にそれを使うようにしたそうです。

以上。終わり!

今回はめっちゃ薄味でしたね…。

44
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?