跳至主要内容

混合

mixed所有类型的超类型。所有值都是 mixed。但是,这意味着在没有细化到更具体的类型的情况下,只能对它执行很少的操作。这是因为对 mixed 的有效操作必须对所有类型有效。

通常,程序有几种不同的类型类别

单个类型

这里输入值只能是 number

1function square(n: number) {2  return n * n;3}

一组不同的可能类型

这里输入值可以是 stringnumber

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 知道 valueif 语句中只能是 string。这被称为 细化

any 相比

mixed 是安全的,而 any 不是。两者都接受所有值,但 any 还允许所有不安全的运算。

empty 相比

mixedempty 相反

  • 所有东西都是 mixed,但在没有首先细化到特定类型的情况下,只能对它执行很少的操作。它是所有类型的超类型。
  • 没有东西是 empty,但可以对它执行任何操作。它是所有类型的子类型。