Подтвердить что ты не робот

В чем разница между `mixed` и` any`?

docs сказать:

  • mixed: "супертип" всех типов. Любой тип может втекать в mixed.
  • any: "динамический" тип. Любой тип может втекать в any и наоборот

Что будет в случае, если mixed и any нельзя использовать взаимозаменяемо?

4b9b3361

Ответ 1

Разница заключается в "обратном": 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.

Ответ 2

"Любой" поддерживает ковариацию и контравариантность. Это потому, что "any" является супертипом и подтипом всех типов.

Следовательно, это работает,

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

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

смешанная поддерживает только ковариацию. Это супер-тип и не подтип всех типов.

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

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

Ковариация - общий тип (родительский) может быть заменен специальным типом (дочерним)

Контравариантность - специальный тип (дочерний) может быть заменен родовым типом (родителем). Это проблема, если она не защищена определенными соглашениями.