似乎the docs说你可以强迫它固定长度。是否可以要求数组包含至少一个元素?
使用Array
类型无法做到这一点。 “长度> = 1的数组”本身不是一个类型,它可以是数组,也可以不是。
文档说你可以强制它固定长度
这是因为此时类型不是数组,类型是“N值的元组”,其中给定数量的项及其类型等于其自己的独立类型。元组也被认为是只读的,因为你不能改变它们的大小。
例如,如果你在数组上调用.pop()
,Flow会做什么?它必须以某种方式被禁止,因为如果长度是类型本身的一部分,更改数组的长度实际上将计为更改对象的类型。
如果您希望更改数组中的项目数,您可以做的是定义自己的类型来验证数组的大小,然后只显示添加项目的方法和大小小于1的抛出。这些是运行时检查,由您来维护。
另一方面,您可以设计自己的数据结构,以确保您想要的。然后,如果您定义自己的数据结构,则类型检查器可以断言至少存在一个值。
type MinOneList<T> = {
value: T,
next: MinOneList<T> | null,
};
所以,如果你有
var foo: MinOneList<T> = ...
保证foo.value
存在,所以列表至少有一个项目。为了使其符合空白,类型必须是MinOneList<T> | null
。