docs と言う:
mixed
:すべてのタイプの「スーパータイプ」。どのタイプもmixed
にフローできます。any
:「動的」タイプ。どのタイプもany
にフローでき、その逆も可能です。
mixed
とany
を交換して使用できない場合はどうなりますか?
違いは「逆も同様」です。any
は他の型にフローできますが、mixed
はフローできません。
/* @flow */
var numeric:number = 0;
var looselyTyped:any;
var someType:mixed;
numeric = looselyTyped;
numeric = someType; //only this will throw a flow check error
リンクしたドキュメントから:
この注釈には特別な性質があるため、特に呼び出す必要があります。フローの静的型付けをエスケープするには、anyを使用します。つまり、フローが邪魔になり、プログラムがタイプが正しいと確信している場合は、エラーパスに沿った場所にタイプanyで注釈を付けることにより、エラーを沈黙させることができます。
「Any」は、共分散と反変をサポートします。これは、「any」がすべてのタイプのスーパータイプおよびサブタイプであるためです。
したがって、これは機能し、
let genericVariable: any = 20;
let numericVariable: number;
genericVariable = numericVariable; // No error
numericVariable = genericVariable; // No error
混合は共分散のみをサポートします。これはスーパータイプであり、notはすべてのタイプのサブタイプです。
let genericVariable: mixed = 20;
let numericVariable: number;
numericVariable = genericVariable; // This shows error
genericVariable = numericVariable; // This works fine.
共分散-ジェネリック型(親)は特別な型(子)で置き換えることができます
反変-特別なタイプ(子)は、ジェネリックタイプ(親)で置き換えることができます。特定の規則で保護されていない限り、これは問題です。
フローがany
を検出した場合は、任意のタイプを使用できることを意味します。プログラムはパラメーターの型に関して無関心であり、結果の型を推測しようとしません。したがって、結果の型もany
になります。
たとえば、次のコードはエラーを報告しません。
// @flow
function add(one: any, two: any): number {
return one + two;
}
add(1, 2); // Works.
add("1", "2"); // Works.
add({}, []); // Works.
ただし、実際のタイプを推測するには、「混合」タイプを何らかの方法で処理する必要があります。
// @flow
function stringify(value: mixed) {
// $ExpectError
return "" + value; // Error!
}
stringify("foo");
代わりに、値を調整して、値が特定のタイプであることを確認する必要があります。
// @flow
function stringify(value: mixed) {
if (typeof value === 'string') {
return "" + value; // Works!
} else {
return "";
}
}
stringify("foo");