typescript 对象的所有唯一叶值的类型脚本提取类型

ctehm74n  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(148)

我有一个常数,它是一棵树,拥有唯一的键作为它的叶子,例如:

const Tree = {
  Branch1: {
    Leaf1: '1'
    SubBranch1: {
      SubLeaf: '11'
    },
    ...
  },
  Branch2: {
    Leaf2: '2'
    SubBranch2: {
      SubLeaf: '21'
    }
  },
  ...
}

我想创建一个泛型类型Leaves<typeof Tree>,它将是所有叶子值的列表,即'1' | '11' | '2' | '21' ...。问题是我找不到任何例子来说明如何有效地将对象树简化为它们的键或类似的东西。

n6lpvg4x

n6lpvg4x1#

您可以使用

const Tree = {
  Branch1: {
    Leaf1: '1',
    SubBranch1: {
      SubLeaf: '11'
    }
  },
  Branch2: {
    Leaf2: '2',
    SubBranch2: {
      SubLeaf: '21'
    }
  }
} as const;

type Leaves<T, L0 = T[keyof T]> = L0 extends Record<string, any> ? Leaves<L0> : L0;

let l: Leaves<typeof Tree>
// ^?let l: "1" | "11" | "2" | "21"

playground
唯一值得解释的是,类型参数L0可能是条件类型(如果有多个键),因此在这种情况下,它作为分布式条件类型工作。
此外,在定义常量时使用as const(constAssert)确保其类型是最特定的情况,否则树叶类型将只是string

注意:已编辑以移除不必要的程式码。原始的playground可能仍然有助于了解它的运作方式。

相关问题