Maybe型
?
をタイプにプレフィックスすることで、null
と void
を含む 共役 とします。?T
は共役 T | null | void
と同等です。
例えば、?number
は number | 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}
null
と undefined
の 2 つのチェックを、両方行う単一の != null
チェックを使用して簡略化できます。
1function acceptsMaybeNumber(value: ?number): number {2 if (value != null) {3 return value * 2;4 }5 return 0;6}
ほとんどの二重等号チェックは JavaScript では推奨されていませんが、上のパターンは安全です(null
と undefined
だけを正確にチェックします)。
また、それを逆に実行して、使用する前に値が number
の型であることを確認することもできます。
1function acceptsMaybeNumber(value: ?number): number {2 if (typeof value === 'number') {3 return value * 2;4 }5 return 0;6}
ただし、タイプの絞り込みは失われる可能性があります。たとえば、オブジェクトのプロパティのタイプを絞り込んだ後に関数を呼び出すと、この絞り込みが無効になります。Flow がこのように機能する理由と、この一般的な落とし穴を回避する方法を理解するには、絞り込みの無効化 のドキュメントを参照してください。