gpt4 book ai didi

arrays - 如何在 TypeScript 中定义具有交替类型的数组?

转载 作者:行者123 更新时间:2023-12-03 16:35:44 25 4
gpt4 key购买 nike

我想定义一个数组类型,它允许根据位置使用不同的类型,但以在某些数据结构中发现的重复、交替的方式。

例子:

[A, B, A, B, ...]
[A, B, C, A, B, C, ...]

这可能吗?

我知道我可以为具有固定数量元素的数组定义它,如上(没有省略号),并且
(A | B)[]

另一方面,将允许任何元素为 A 或 B 类型。

我试过这些:
[(A, B)...]
[...[A, B]]
[(A, B)*]

最佳答案

我想出了一些“有效”的东西,但这有点疯狂:

type Alternating<T extends readonly any[], A, B> =
T extends readonly [] ? T
: T extends readonly [A] ? T
: T extends readonly [A, B, ...infer T2]
? T2 extends Alternating<T2, A, B> ? T : never
: never
由于递归条件类型,这需要 TypeScript 4.1+。

天真的用法需要将值复制为 T 的文字类型。不理想的参数:
const x: Alternating<[1, 'a', 2], number, string> = [1, 'a', 2]
这似乎比仅仅写出更糟糕 [number, string, number]作为类型。然而,在虚拟函数的帮助下,可以避免重复:
function mustAlternate<T extends readonly any[], A, B>(
_: Alternating<T, A, B>
): void {}

const x = [1, 'a', 2] as const
mustAlternate<typeof x, number, string>(x)
Here's a live demo with some test cases .

我实际上不建议在典型的代码库中依赖它(使用起来很尴尬并且错误消息很糟糕)。我主要是通过它来查看类型系统可以扩展多远。
如果有人有关于如何让它不那么不稳定的建议,我全神贯注!

关于arrays - 如何在 TypeScript 中定义具有交替类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61155425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com