似乎the docs表示你可以强制它固定长度。是否可以要求数组包含至少一个元素?
答案 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
。