文档说:
mixed:是所有类型的“超级类型”。任何类型都可以流到mixed中。any:是“动态”类型。任何类型都可以流入any,反之亦然。什么情况下mixed和any不能互换使用?
发布于 2015-05-04 05:32:08
区别在于“反之亦然”:any可以流到其他类型,但mixed不能。
/* @flow */
var numeric:number = 0;
var anyTyped:any;
var mixTyped:mixed;
numeric = anyTyped;
numeric = mixTyped; // This will throw a flow check error: "Cannot assign `mixTyped` to `numeric` because mixed is incompatible with number. [incompatible-type]"从你链接到的文档中:
由于这一注解的特殊性,任何具体的标注都是值得的。使用any来转义流的静态类型。换句话说,如果流妨碍了您的工作,并且您完全相信您的程序是正确的,那么您可以使用类型any注释错误路径上的位置,从而使错误保持沉默。
发布于 2016-12-07 19:58:09
"Any“支持协方差和反方差。这是因为"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.协方差-泛型(父)可以用特殊类型(子)代替。
反方差-特殊类型(子类型)可以由泛型类型(父类型)代替。这是一个问题,除非受到某些公约的保护。
发布于 2018-10-31 23:11:46
当flow看到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");https://stackoverflow.com/questions/30004233
复制相似问题