Mixed
mixed
は、すべての型のスーパータイプです。すべての値は mixed
です。ただし、これは、より具体的な型に絞り込まなければ、ごく少数の操作しか許可されないことを意味します。これは、mixed
に対する有効な操作は、すべての型に対して有効でなければならないためです。
一般的に、プログラムにはいくつかの異なるカテゴリの型があります。
単一の型
ここでは、入力値は number
のみ可能です。
1function square(n: number) {2 return n * n;3}
異なる型のグループ
ここでは、入力値は string
または number
のいずれかになります。
1function stringifyBasicValue(value: string | number) {2 return '' + value;3}
別の型に基づく型
ここでは、戻り値の型は、関数に渡される値の型と同じになります。
1function identity<T>(value: T): T {2 return value;3}
これら3つは、最も一般的な型のカテゴリです。これらは、あなたが書くことになる型の大部分を占めるでしょう。
ただし、4番目のカテゴリもあります。
何でもありうる任意の型
ここでは、渡される値は不明な型であり、任意の型である可能性があり、関数はそれでも動作します。
1function getTypeOf(value: mixed): string {2 return typeof value;3}
これらの不明な型はあまり一般的ではありませんが、それでも役に立つ場合があります。
これらの値は mixed
で表す必要があります。
何でも入り、何も出てこない
mixed
は、あらゆる種類の値を受け入れます。文字列、数値、オブジェクト、関数など、何でも機能します。
1function stringify(value: mixed) {2 // ...3}4
5stringify("foo");6stringify(3.14);7stringify(null);8stringify({});
mixed
型の値を使用しようとすると、最初に実際の型が何であるかを把握する必要があります。そうでないと、エラーが発生します。
1function stringify(value: mixed) {2 return "" + value; // Error! 3}4
5stringify("foo");
2:10-2:19: Cannot use operator `+` with operands string [1] and mixed [2] [unsafe-addition]
代わりに、絞り込むことによって、値が特定の型であることを確認する必要があります。
1function stringify(value: mixed) {2 if (typeof value === 'string') {3 return "" + value; // Works!4 } else {5 return "";6 }7}8
9stringify("foo");
typeof value === 'string'
チェックにより、Flow は if
文の中で value
が string
のみになる可能性があることを認識しています。これは、絞り込みと呼ばれます。
any
との比較
mixed
は安全ですが、any
は安全ではありません。どちらもすべての値を受け入れますが、any
はすべての操作を安全でない方法で許可します。
empty
との比較
mixed
は empty
の反対です。
- すべては
mixed
ですが、最初に特定の型に絞り込まなければ、許可される操作はほとんどありません。これは、すべての型のスーパータイプです。 empty
は何もありませんが、あらゆる操作が許可されています。これは、すべての型のサブタイプです。