我想知道是否有可能在使用typescript的类型系统中定义非空列表。我知道我可以定义n
元素的列表,类似于元组:
type TwoElementList = [number, number];
但是这仅适用于预定义长度的列表。
我正在看Haskell上流行的CIS 194课程,它提供了一个使用类型系统定义非空列表的示例:
data NonEmptyList a = NEL a [a]
我思考这在打字稿中是不可能的;但我想知道是否有人可以确认这一点。
在定义NonEmptyList
的CIS 914部分中,我们看到了此“接口”与标准列表的转换:
nelToList :: NonEmptyList a -> [a]
nelToList (NEL x xs) = x:xs
listToNel :: [a] -> Maybe (NonEmptyList a)
listToNel [] = Nothing
listToNel (x:xs) = Just $ NEL x xs
因此,@ JeffreyWesterkamp指出,打字稿中的等效项确实具有与标准列表不同的接口,并且确实可以创建在接口[number, [number]]
和[number]
之间转换的函数。
不过,为说明我的意思,请考虑以下打字稿:
type NumberPair = [number, number];
const x: NumberPair = [1, 1];
const y = x[2];
这里打字稿将显示编译错误,因为我们无法访问[2]
上的NumberPair
。类似地,对于不固定长度的列表,索引处的元素类型为联合T | undefined
;可以理解,因为我们不知道列表中是否存在索引i
。但是在非空列表中,我们总是可以保证索引0
存在。我想知道的是,是否有可能让类型脚本从类型签名中确定它始终能够从类型中至少获取1个元素。
是的,的确有可能!
type NonEmptyArray<T> = [T, ...T[]];