TypeScript:将输入类型T映射到树状类型

TypeScript:将输入类型T映射到树状类型,typescript,typescript-typings,Typescript,Typescript Typings,这是一个后续行动 抱歉,如果它看起来像“写我的代码”的问题,它肯定不是这样的!我刚刚开始学习高级打字,我发现很难掌握表达类型的可能性。所以请容忍我:) 在我的代码中,我想将一个对象转换为树结构。代码已经在这样做了,但是我希望类型能够正确地反映这一点。代码遍历对象的每个属性(或数组中的项),并将它们转换为节点 我目前的做法是: interface Node<Type, Children> { value: Type, children: Children[], } func

这是一个后续行动

抱歉,如果它看起来像“写我的代码”的问题,它肯定不是这样的!我刚刚开始学习高级打字,我发现很难掌握表达类型的可能性。所以请容忍我:)

在我的代码中,我想将一个对象转换为树结构。代码已经在这样做了,但是我希望类型能够正确地反映这一点。代码遍历对象的每个属性(或数组中的项),并将它们转换为节点

我目前的做法是:

interface Node<Type, Children> {
  value: Type,
  children: Children[],
}

function treeOf<T>(
  value: T,
): Node<
  T,
  {
    [K in T]: Node<T[K], any[]>[]
  },
> 
接口节点{
值:类型,
儿童:儿童[],
}
函数树(
值:T,
):节点<
T
{
[K in T]:节点[]
},
> 
。。。给我一个TypeScript错误:

Type 'Node<{ [x: string]: T[any]; }, any[]>' does not satisfy the constraint 'Node<unknown, any[]>[]'.
  Type 'Node<{ [x: string]: T[any]; }, any[]>' is missing the following properties from type 'Node<unknown, any[]>[]': length, pop, push, concat, and 26 more.
类型“Node”不满足约束“Node[]”。
类型“Node”缺少类型“Node[]”中的以下属性:长度、弹出、推送、concat等。
。。。我认为它也不能正确处理数组,因为它考虑数组的属性(“push”、“pop”…)而不是它的项

我也试过了

function treeOf<T>(
  value: T,
): Node<
  T,
  Node<
    {
      [K in T]: T[K];
    },
    any[]
  >
> {
函数树(
值:T,
):节点<
T
节点<
{
[K in T]:T[K];
},
任何[]
>
> {
…但没有用

同样,我不知道TypeScript是否也能做到这一点,或者我现在是否有很多要求。但也许有人可以告诉我:)

斯塔克比茨

你能分享你的treeOf方法的代码吗?或者分享一个小提琴吗?对不起,要理解你的输出树的本质有点难。比如为什么会有结果。孩子们[1];应该是节点?子级索引是树的一个级别吗?当然。会很快更新它:)是的,索引是子级的。我在这里看到的明显问题是对象键没有排序。TS无法将
{a:string,b:number}
转换为元组
[{name:“a”,value:string},{name:“b”,value:number}]
因为它也可以是
[{name:“b”,value:number},{name:“a”,value:string}]
。如果您对
Array
感到满意,这很好,但它不能保证每个元素都只存在一次。而且,拥有一个数组对编译器来说是非常费力的。那么您希望看到什么类型?您希望编译器认为
treeOf({a:,b:0})的children属性是什么类型
是吗?我已经抛出或组合在一起了,但我不知道这是否是您正在寻找的。无论是什么,数组转换的对象键都将是有损的、复杂的、恼人的,或者三者兼而有之。