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

Maybe型

? をタイプにプレフィックスすることで、nullvoid を含む 共役 とします。?T は共役 T | null | void と同等です。

例えば、?numbernumber | null | void と同等で、値として数字、null、および undefined を許可します。それは「Maybe」数値です。

1function acceptsMaybeNumber(value: ?number) {2  // ...3}4
5acceptsMaybeNumber(42);        // Works!6acceptsMaybeNumber();          // Works! (implicitly undefined)7acceptsMaybeNumber(undefined); // Works!8acceptsMaybeNumber(null);      // Works!9acceptsMaybeNumber("42");      // Error!
9:20-9:23: Cannot call `acceptsMaybeNumber` with `"42"` bound to `value` because string [1] is incompatible with number [2]. [incompatible-call]

オブジェクトの場合、欠落している プロパティは undefined プロパティとして明示的に示されているものと同じではありません。

1function acceptsMaybeProp({value}: {value: ?number}) {2  // ...3}4
5acceptsMaybeProp({value: undefined}); // Works!6acceptsMaybeProp({});                 // Error!
6:18-6:19: Cannot call `acceptsMaybeProp` with object literal bound to the first parameter because property `value` is missing in object literal [1] but exists in object type [2]. [prop-missing]

欠落しているプロパティを許可する場合は、? がコロンの前に置かれる オプションのプロパティ 構文を使用します。オプションの maybe の型の両方の構文を組み合わせて、たとえば {value?: ?number} のようにすることもできます。

Maybe型の絞り込み

?number の型があるとします。その値を number として使用したい場合、最初にそれが null でも undefined でもないことを確認する必要があります。

1function acceptsMaybeNumber(value: ?number): number {2  if (value !== null && value !== undefined) {3    return value * 2;4  }5  return 0;6}

nullundefined の 2 つのチェックを、両方行う単一の != null チェックを使用して簡略化できます。

1function acceptsMaybeNumber(value: ?number): number {2  if (value != null) {3    return value * 2;4  }5  return 0;6}

ほとんどの二重等号チェックは JavaScript では推奨されていませんが、上のパターンは安全です(nullundefined だけを正確にチェックします)。

また、それを逆に実行して、使用する前に値が number の型であることを確認することもできます。

1function acceptsMaybeNumber(value: ?number): number {2  if (typeof value === 'number') {3    return value * 2;4  }5  return 0;6}

ただし、タイプの絞り込みは失われる可能性があります。たとえば、オブジェクトのプロパティのタイプを絞り込んだ後に関数を呼び出すと、この絞り込みが無効になります。Flow がこのように機能する理由と、この一般的な落とし穴を回避する方法を理解するには、絞り込みの無効化 のドキュメントを参照してください。