【发布时间】:2021-12-15 06:18:04
【问题描述】:
我有一个查询元素数组,其中每个元素可以是一个术语或子查询,包含以“AND”或“OR”开头,后跟一个合法查询元素、术语或嵌套子查询的数组,等等开。
例如,这些都应该是合法的输入:
const query1 = "Hello"
const query2 = ["AND", "Hello", "World"]
const query3 = ["OR", ["AND", "Hello", "World"], ["AND", "Hola", "Mundo"]]
Variadric Tuples 在 TS 4.0 中应该允许您键入数组的第一个元素,其余的则使用另一种类型:
type IQuery = ["AND" | "OR", ...Array<string>]
const query = ["AND", "Hello", "World"] // valid
TS 3.7 中的 Recursive Types 应该允许您定义使用自身的类型:
type IQueryOps = string | Array<IQueryOps>
const query: IQueryOps = ["Hello", "World", ["Hola", "Mundo"]] // valid
但是当圆形类型展开时,我似乎无法将两者结合起来。在这种情况下,每个查询都以一个运算符开头,然后是一个字符串或另一个像这样的有效查询:
type IOperator = "AND" | "OR"
type IQuery = [IOperator, ...Array<string | IQuery>]
在这种情况下,我得到了错误:
类型别名“IQuery”循环引用自身。(2456)
有没有办法输入这个,即使有变通方法,还是我必须从类型的角度将它解包到我想要支持的所需深度?
Demo in TS Playground
进一步阅读
【问题讨论】:
标签: typescript recursion variadic-tuple-types