Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@vvakame

TypeScript v3.3.0-rc 変更点

More than 1 year has passed since last update.

こんにちはメルペイ社@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を作り、内部的にそれを使うようにしたそうです。

以上。終わり!

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

16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
vvakame
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?