混合
mixed
是 所有类型的超类型。所有值都是 mixed
。但是,这意味着在没有细化到更具体的类型的情况下,只能对它执行很少的操作。这是因为对 mixed
的有效操作必须对所有类型有效。
通常,程序有几种不同的类型类别
单个类型
这里输入值只能是 number
。
1function square(n: number) {2 return n * n;3}
一组不同的可能类型
这里输入值可以是 string
或 number
。
1function stringifyBasicValue(value: string | number) {2 return '' + value;3}
基于另一种类型的类型
这里返回值类型将与传递给函数的值的类型相同。
1function identity<T>(value: T): T {2 return value;3}
这三种是最常见的类型类别。它们将构成您将编写的绝大多数类型。
但是,还有第四类。
可以是任何东西的任意类型
这里传入的值是未知类型,它可以是任何类型,函数仍然可以工作。
1function getTypeOf(value: mixed): string {2 return typeof value;3}
这些未知类型不太常见,但在某些情况下仍然有用。
您应该使用 mixed
来表示这些值。
任何东西都可以输入,什么也无法输出
mixed
将接受任何类型的 value。字符串、数字、对象、函数 - 任何东西都可以工作。
1function stringify(value: mixed) {2 // ...3}4
5stringify("foo");6stringify(3.14);7stringify(null);8stringify({});
当您尝试使用 mixed
类型的 value 时,您必须首先弄清楚实际类型是什么,否则您将遇到错误。
1function stringify(value: mixed) {2 return "" + value; // Error! 3}4
5stringify("foo");
2:10-2:19: Cannot use operator `+` with operands string [1] and mixed [2] [unsafe-addition]
相反,您必须通过 细化 来确保 value 是一种特定类型。
1function stringify(value: mixed) {2 if (typeof value === 'string') {3 return "" + value; // Works!4 } else {5 return "";6 }7}8
9stringify("foo");
由于 typeof value === 'string'
检查,Flow 知道 value
在 if
语句中只能是 string
。这被称为 细化。
与 any
相比
mixed
是安全的,而 any
不是。两者都接受所有值,但 any
还允许所有不安全的运算。
与 empty
相比
mixed
与 empty
相反
- 所有东西都是
mixed
,但在没有首先细化到特定类型的情况下,只能对它执行很少的操作。它是所有类型的超类型。 - 没有东西是
empty
,但可以对它执行任何操作。它是所有类型的子类型。