web-dev-qa-db-ja.com

`mixed`と` any`の違いは何ですか?

docs と言う:

  • mixed:すべてのタイプの「スーパータイプ」。どのタイプもmixedにフローできます。
  • any:「動的」タイプ。どのタイプもanyにフローでき、その逆も可能です。

mixedanyを交換して使用できない場合はどうなりますか?

44
Aton

違いは「逆も同様」です。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で注釈を付けることにより、エラーを沈黙させることができます。

26
ekuusela

「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.

共分散-ジェネリック型(親)は特別な型(子)で置き換えることができます

反変-特別なタイプ(子)は、ジェネリックタイプ(親)で置き換えることができます。特定の規則で保護されていない限り、これは問題です。

20
VenCKi

フローが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");
1
Andrei