【问题标题】:TypeScript generic type that accepts (1) a tree and (2) a type with which all the tree's nodes should become a unionTypeScript 泛型类型,它接受 (1) 一棵树和 (2) 一种类型,所有树的节点都应该成为一个并集
【发布时间】:2023-03-22 05:40:01
【问题描述】:

假设我有一个任意的树类型:

type Tree = {
  a: {
    b: {
      c: "d"
    }
  }
}

我想让每个树节点成为联合的类型。例如,"f"。换句话说,树应该变成下面这样:

type Tree = {
  a: {
    b: {
      c: "d" | "f"
    } | "f"
  } | "f"
} | "f"

我的目标是能够使用实用程序类型创建 ^ 这种类型——也许类似于DescendantsUnionedWith<T, F>,其中T 可能是上面的Tree 类型,F 可能是@ 987654328@.

为了解决这个问题,我首先创建了一个通用的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 实用程序类型的方法吗?

谢谢!

【问题讨论】:

    标签: typescript replace types tree union


    【解决方案1】:

    这应该有效....忽略它所说的类型出来,因为它没有读取它实际上是什么。测试如下....

    如果有任何问题,请告诉我。

    type DeepUpdate<T, Append> = {
      [K in keyof T]: T[K] extends object ? DeepUpdate<T[K], Append> | Append : T[K] | Append
    }
    
    type Tree = {
      a: {
        b: {
          c: "d"
        }
      }
    }
    
    
    type IsEqual<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false
    
    
    type test = IsEqual<DeepUpdate<Tree, "F">, {
      a: {
        b: {
          c: "d" | "F"
        } | "F"
      } | "F"
    }>; // true.
    
    
    

    【讨论】:

    • 这似乎是解决方案!谢谢!我想知道为什么编译器将类型解析为等于 { a: "F" | ChildrenUnionWith&lt;{ b: { c: "d"; }; }, "F"&gt;; } 。 ——如果能继续顺着树下去就好了。再次,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多