従来のオブジェクト指向言語(C、C#、Java)に触れたことがある場合は、おそらく列挙型のデータ型を見たことがあるでしょう。 JavaScriptは列挙型をサポートしていませんが、Flowのタイプチェックでそれを補うことができます。

列挙型はどこで役に立ちますか?

ポーカーチップを扱うプログラムを書いているとしましょう。 チップの色はひもです(すなわち 「赤」、「青」など)。 したがって、Chipタイプは次のようになります。

type Chip = {
  color: string,
};

…そしてチップを作成する関数は次のようになります。

function createChip(color: string): Chip {
  return {
    color,
  };
}

ただし、有効な色のみを使用していることを確認する必要があります。

// This should be valid.
createChip('red');
// This should not.
createChip('cyan');
// This isn't even a color.
createChip('Nicomachean Ethics');

列挙型の作成

列挙型を定義する最も簡単な方法は、文字列リテラルの和集合としてです。

// 'red', 'blue', and 'green' are valid colors.
type Color = 'red' | 'blue' | 'green';

ここから、stringの代わりにタイプColorを使用できます。

type Chip = {
  // `color` can only be a valid color.
  color: Color,
};

// `createChip` only takes values of type `Color`.
function createChip(color: Color): Chip {
  return {
    color,
  };
}

既存の値から列挙型を作成する

ポーカーチップは色によって価値があります。 したがって、プロジェクトのどこかに値を検索するオブジェクトがあるとしましょう。

const chipValues = {
  red: 5,
  blue: 10,
  green: 25,
};

ColorタイプはchipValuesのキーを繰り返しています。3つしかない場合はそれほど悪くはありませんが、それでも重複しているため、さらに追加すると煩わしくなります。 フローは、$Keysタイプのオブジェクトのキーから列挙型を導出する方法を提供します。

type Color = $Keys<typeof chipValues>;