【发布时间】:2021-04-02 07:59:56
【问题描述】:
我正在尝试对两种类型的节点的递归树关系建模:文本节点和元素节点(如 DOM)。文本节点是树中的叶子,元素节点可以包含其他元素节点或文本节点。
type Text = {
text: string
}
type Element = {
children: Node[]
}
type Node = Element | Text
考虑这些节点:
type A = {
children: Text[]
}
type B = {
children: A[]
}
type C = {
children: B[]
}
给定一个特定的Node,我想编写一个实用程序类型,该类型将返回其潜在后代的联合(深)。
只为孩子编写实用程序(浅)很简单:
type ChildOf<N extends Node> =
N extends Element
? N['children'][number]
: never
ChildOf<A> // Text
ChildOf<B> // A
ChildOf<C> // B
ChildOf<Text> // never
但是,您将如何编写一个递归实用程序来获取所有深层后代,而不仅仅是浅层子代?
type DescendantOf<N extends Node> = ???
DescendantOf<A> // Text
DescendantOf<B> // A | Text
DescendantOf<C> // A | B | Text
DescendantOf<Text> // never
【问题讨论】:
标签: typescript