スクリプト言語とコンパイル言語の大きな違いとして変数の型付けがあげられます。それによって入力値と出力値の保証ができるので思わぬデータの入力による不具合発生が抑えられるようになります。 JavaScriptでは特に静的型付けを求める声が大きいように思います。ということでそれを可能にするソフトウェア、Flowを紹介します。

Flowの使い方

例えば次のようなコードがあります。

$ cat hello.js 
/* @flow */

function foo(x) {
  return x*10;
}

foo("Hello, world!");

これをFlowを使って評価します。

$ flow hello.js 
01_HelloWorld/hello.js:7:5,19: string
This type is incompatible with
  hello.js:4:10,13: number

Found 1 error

そうするとこのようにエラーが出ます。入力値とその関数側とで評価し、エラーを出しています。

さらに型の指定も可能です。ただしこの書き方はJavaScriptでは実行できないようです。

$ cat type_annotations.js 
/* @flow */

function foo(x: string, y: number): string {
  return x.length * y;
}

foo("Hello", 42);

この書き方をした場合、返値が文字列なのは問題があります。

$ flow type_annotations.js 
  :
type_annotations.js:4:10,21: number
This type is incompatible with
  type_annotations.js:3:37,42: string

Found 1 error

実行すると確かに返値に問題があるというエラーが出ています。

型の指定はstring/numberだけでなく配列でもできます。

$ cat arrays.js 
/* @flow */

function total(numbers: Array<number>) {
  var result = 0;
  for (var i = 0; i < numbers.length; i++) {
    result += numbers[i];
  }
  return result;
}

total([1, 2, 3, "Hello"]);

このようなコードに対して実行します。ちゃんと配列の中身についてエラーが出ます。

$ flow arrays.js 
  :
arrays.js:11:17,23: string
This type is incompatible with
  arrays.js:3:31,36: number

Found 1 error

FlowはそのままではJavaScriptのコードは動きませんが、Flowがチェックした後にJavaScriptのコードを出力してくれる機能がつくと便利な存在になりそうです。静的な型付けを想定したJavaScript代替言語はいくつかありますが、普通のJavaScriptを対象にしたFlowも面白い存在ではないでしょうか。

FlowはMac OSX、Linux用のオープンソース・ソフトウェア(BSD License)です。

Flow | A static type checker for JavaScript facebook/flow