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

问题描述 投票:1回答:1

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

flowtype
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.