我是打字稿的新手,我想了解如何在两种类型之间设置循环引用.引用不必是完整的代码引用,只需要接口,但接口定义在单独的文件中.例如,假设我有两个接口:Parent和Child.它们是双重关联的,因此父母有一个孩子的集合,每个孩子都有父母的参考(如下所示).如何设置导入或依赖项,以便可以在单独的文件中定义它们?
interface Parent {
children: Child[]
}
interface Child {
parent: Parent
}
Run Code Online (Sandbox Code Playgroud) 在这个问答中,我看到一个联合类型定义被包裹在方括号中(编辑:问题现在已经解决了)。到目前为止,我只见过没有方括号的联合类型。例如有什么区别:
type UnionA = number | string;
type UnionB = [number | string];
Run Code Online (Sandbox Code Playgroud)
我知道 TS 中方括号的含义如下:
T[]假设我们尝试创建HTML构建帮助器
build([
'html', { lang: 'en' }, [
['head', [
['title', 'Hello, world!']
]
]
])
Run Code Online (Sandbox Code Playgroud)
the参数的类型声明build将是(实际上会更复杂,但让我们考虑最简单的情况)
type Node = [string, { [key: string]: string }, Node[]]
Run Code Online (Sandbox Code Playgroud)
不幸的是,id无效,因为TypeScript抱怨
TS2456: Type alias 'Node' circularly references itself.
Run Code Online (Sandbox Code Playgroud)
有什么解决方法吗?
我有一个查询元素数组,其中每个元素可以是一个术语或一个子查询,其中包含以“AND”或“OR”开头,后跟一组合法查询元素、术语或嵌套子查询等。
例如,这些都应该是合法的输入:
const query1 = "Hello"
const query2 = ["AND", "Hello", "World"]
const query3 = ["OR", ["AND", "Hello", "World"], ["AND", "Hola", "Mundo"]]
Run Code Online (Sandbox Code Playgroud)
TS 4.0中的Variadric Tuple应该允许您输入数组的第一个元素,并为其余元素输入另一种类型:
type IQuery = ["AND" | "OR", ...Array<string>]
const query = ["AND", "Hello", "World"] // valid
Run Code Online (Sandbox Code Playgroud)
TS 3.7中的递归类型应该允许您定义使用自身的类型:
type IQueryOps = string | Array<IQueryOps>
const query: IQueryOps = ["Hello", "World", ["Hola", "Mundo"]] // valid
Run Code Online (Sandbox Code Playgroud)
但当圆形类型展开时,我似乎无法将两者结合起来。在这种情况下,每个查询都以一个运算符开头,后面跟着一个字符串或另一个有效的查询,如下所示:
type IOperator = "AND" | "OR"
type IQuery = [IOperator, ...Array<string | IQuery>]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我收到错误:
类型别名“IQuery”循环引用自身。(2456) …