Допустим, у меня есть произвольный тип дерева:
type Tree = {
a: {
b: {
c: "d"
}
}
}
И тип, с которым я хотел бы сделать каждый узел дерева объединением. Например, "f"
. Другими словами, дерево должно выглядеть следующим образом:
type Tree = {
a: {
b: {
c: "d" | "f"
} | "f"
} | "f"
} | "f"
Моя цель - создать этот тип, используя тип утилиты - возможно, что-то вроде DescendantsUnionedWith<T, F>
, где T
это может быть тип Tree
сверху, а F
может быть "f"
.
Чтобы решить эту проблему, я сначала создал общий тип ChildrenUnionedWith
:
export type ChildrenUnionedWith<O extends object, T> = {
[K in keyof O]: O[K] | T;
};
Затем я попытался создать рекурсивный тип с глубиной дерева:
export type DescendantsUnionedWith<Tree extends object, T> = Tree extends object
? ChildrenUnionedWith<DescendantsUnionedWith<Tree, T>, T>
: Tree | T;
Результатом, конечно, была ошибка округлости: /
Кто-нибудь знает способ, которым я могу достичьDescendantsUnionedWith
тип утилиты?
Спасибо!