メインコンテンツへスキップ

バージョン-0.14.0

FlowのリリースをGitHubで執拗にチェックしている人が全員ではないことが判明しました。これは驚きでしたが、これらのユーザーもサポートしたいと思います。したがって、このリリースから始めて、各Flowのリリースをブログで発表します。

Flow v0.14.0 がリリースされました!変更点の正式なリストについては、変更履歴を確認してください。

非交和の発表

プログラムは、コードが参照しているデータの種類に応じてデータの形状が異なる可能性がある、さまざまな種類のデータを一度に処理する必要がある場合があります。この種のプログラミングは関数型プログラミング言語で非常に一般的であるため、ほとんどすべての言語に以下の方法が用意されています。

  • 異なる「タグ」で区別される、互いに素なケースのセットによってそのようなデータを指定します。各タグは、異なるプロパティの「レコード」に関連付けられています。(これらの記述は、「非交和」または「バリアント」型と呼ばれます。)
  • タグを確認し、関連付けられたプロパティのレコードに直接アクセスすることによって、そのようなデータに対してケース分析を行います。(このようなケース分析の一般的な方法は、パターンマッチングによるものです。)

そのようなデータを分析または変換するプログラムの例は、抽象構文木を扱うコンパイラーから、例外値を返す可能性のある操作まで多岐にわたります!

Flow 0.13.1 の時点では、JavaScript で型安全な方法でこのスタイルでプログラミングできるようになりました。オブジェクト型の非交和を定義し、それらのオブジェクト型の一部の共通プロパティ(「センチネル」と呼ばれる)の値を切り替えることで、その型のオブジェクトに対してケース分析を行うことができます。

非交和のFlowの構文は次のようになります。

type BinaryTree =
{ kind: "leaf", value: number } |
{ kind: "branch", left: BinaryTree, right: BinaryTree }

function sumLeaves(tree: BinaryTree): number {
if (tree.kind === "leaf") {
return tree.value;
} else {
return sumLeaves(tree.left) + sumLeaves(tree.right);
}
}

境界付き多相性の発表

Flow 0.5.0 の時点では、型パラメーターに境界を設定して多相関数とクラスを定義できます。これは、型パラメーターに何らかの制約が必要な関数やクラスを記述するのに非常に役立ちます。Flowの境界付き多相性の構文は次のようになります。

class BagOfBones<T: Bone> { ... }
function eat<T: Food>(meal: T): Indigestion<T> { ... }

問題点

Flowで多相関数を定義する次のコードを考えてみましょう。

function fooBad<T>(obj: T): T {
console.log(Math.abs(obj.x));
return obj;
}

このコードは型チェックされません(そして、そうすべきではありません!)。obj: T のすべての値がプロパティ x を持つとは限りませんし、Math.abs() によって課される追加の要件を考えると、プロパティ xnumber であるとは限りません。

Flowコメントの発表

Flow 0.4.0 の時点では、Flow固有の構文を特別なコメントに記述できます。これらの特別なコメントを使用すると、コードを実行する前にFlow固有の構文を変換する必要がなくなります。特別なコメントなしでコードを記述することを強くお勧めしますが、この機能はFlowストリッピング変換をセットアップに組み込むことができないユーザーに役立ちます。これは、最も要望の多かった機能の1つであり、さらに多くの人がFlowを使用できるようになることを願っています!

この機能では、/*:/*::/*flow-include の3つの特別なコメントが導入されています。Flow は、これらの特別なコメント内のコードを読み取り、特別なコメントトークンが存在しないかのようにコードを処理します。これらの特別なコメントは有効な JavaScript ブロックコメントであるため、JavaScript エンジンはコメント内のコードを無視します。

型インポートの発表

Flow 0.3.0 の時点では、別のモジュールから型をインポートできるようになりました。たとえば、型注釈で参照する目的でのみクラスをインポートする場合は、新しい import type 構文を使用してこれを行うことができます。

動機

こんな経験はありませんか?

// @flow

// Post-transformation lint error: Unused variable 'URI'
import URI from "URI";

// But if you delete the require you get a Flow error:
// identifier URI - Unknown global name
module.exports = function(x: URI): URI {
return x;
}

これで解決策が得られます!この問題を解決するために(そして、ES6モジュール構文の近い将来を見据えて)、新しい import type 構文を追加しました。import type を使用すると、ここで本当に意味したいことを伝えることができます。つまり、クラス自体ではなく、クラスのをインポートしたいということです。

型キャストの発表

バージョン 0.3.0 の時点で、Flow は型キャスト式をサポートしています。

型キャスト式は、任意の JavaScript 式に型注釈を付ける簡単な方法です。型キャストの例を次に示します。

(1 + 1 : number);
var a = { name: (null: ?string) };
([1, 'a', true]: Array<mixed>).map(fn);

任意の JavaScript 式 <expr> と任意の Flow 型 <type> に対して、次のように記述できます。

(<expr> : <type>)

注: かっこは必須です。