使用flow,我如何要求数组包含至少一个元素?

时间:2018-02-28 19:41:40

标签: flowtype

似乎the docs表示你可以强制它固定长度。是否可以要求数组包含至少一个元素?

1 个答案:

答案 0 :(得分:2)

使用Array类型无法执行此操作。 “长度大于> = 1的数组”本身不是一个类型,它可以是数组,也可以不是。

  

文档说你可以强制它固定长度

这是因为此时类型不是数组,类型是“N值的元组”,其中给定数量的项及其类型等同于它自己的独立类型。元组也被认为是只读的,因为你不能改变它们的大小。

例如,如果你在数组上调用.pop(),Flow会做什么?它必须以某种方式被禁止,因为如果长度是类型本身的一部分,更改数组的长度实际上将被视为更改对象的类型。

如果您希望更改数组中的项数,您可以做的是定义自己的类型来验证数组的大小,然后只显示添加项的方法和大小小于1的抛出在一天结束时,这些是运行时检查,由你来维护。

另一方面,您可以设计自己的数据结构,以确保您想要的。然后,如果您定义自己的数据结构,则类型检查器可以断言存在至少一个值,例如

type MinOneList<T> = {
  value: T,
  next: MinOneList<T> | null,
};

所以,如果你有

var foo: MinOneList<T> = ...

保证foo.value存在,因此列表至少有一个项目。要使其符合空值,类型必须为MinOneList<T> | null