web-dev-qa-db-fra.com

Quelle est la difference entre `mixed` et` any`?

Les docs say:

  • mixed: le "supertype" de tous les types. N'importe quel type peut entrer dans une mixed.
  • any: le type "dynamique". N'importe quel type peut entrer dans any et vice-versa

Quel serait un cas où mixed et any ne peuvent pas être utilisés indifféremment?

36
Aton

La différence est le "vice-versa": any peut s'écouler dans d'autres types mais mixed ne le peut pas.

/* @flow */
var numeric:number = 0;
var looselyTyped:any;
var someType:mixed;

numeric = looselyTyped;
numeric = someType; //only this will throw a flow check error

À partir de la documentation que vous avez liée à:

Cela vaut la peine d’en appeler spécialement en raison de la nature particulière de cette annotation. Utilisez any pour échapper au typage statique de Flow. En d'autres termes, si Flow vous gêne et que vous êtes absolument convaincu que votre programme est correct, vous pouvez supprimer les erreurs en annotant les emplacements le long des chemins d'erreur avec type.

24
ekuusela

"Any" prend en charge la covariance et la contravariance. C'est parce que "tout" est un super-type et un sous-type de tous les types.

Par conséquent cela fonctionne, 

let genericVariable: any = 20;
let numericVariable: number;

genericVariable = numericVariable; // No error
numericVariable = genericVariable; // No error

covariance de supports mixtes uniquement. C'est un super-type et pas un sous-type de tous les types. 

let genericVariable: mixed = 20;
let numericVariable: number;

numericVariable = genericVariable; // This shows error
genericVariable = numericVariable; // This works fine.

Covariance - Le type générique (parent) peut être remplacé par un type spécial (enfant)

Contravariance - Le type spécial (enfant) peut être remplacé par le type générique (parent). C'est un problème, à moins d'être protégé par certaines conventions.

16
VenCKi

Lorsque le flux voit any, cela signifie que vous pouvez utiliser n’importe quel type. Le programme est indifférent quant au type du paramètre et il ne tentera pas d'inférer le type de résultat. Donc, le type de résultat sera aussi any.

Par exemple, le code suivant ne signalera aucune erreur:

// @flow
function add(one: any, two: any): number {
  return one + two;
}

add(1, 2);     // Works.
add("1", "2"); // Works.
add({}, []);   // Works.

Mais le type "mixte" doit être traité de façon à en déduire le type réel.

// @flow
function stringify(value: mixed) {
  // $ExpectError
  return "" + value; // Error!
}

stringify("foo");

Au lieu de cela, vous devez vous assurer que la valeur est d'un certain type en l'affinant.

// @flow
function stringify(value: mixed) {
  if (typeof value === 'string') {
    return "" + value; // Works!
  } else {
    return "";
  }
}

stringify("foo");
0
Andrei