在 TypeScript 中获取双重嵌套对象的所有值类型

ama*_*iny 6 typescript

我的问题类似于来自 Typescript 中对象的键和值的类型,但有一个额外的嵌套层:

interface Outer {
  a: {
    b: number
  },
  c: {
    d: string
  }
}
Run Code Online (Sandbox Code Playgroud)

我只想在此处检索所有值的联合类型number | string

这是我的刺:

type Values<T extends Record<string, any>> = T[keyof T]; // From previous SO answer

type InnerValues<
  T extends Record<string, Record<string, any>>,
  K extends keyof T
> = T[K][keyof T[K]];

type All = Values<Outer>;
type In = InnerValues<Outer, keyof Outer>; // expected number|string

Run Code Online (Sandbox Code Playgroud)

但我有一个错误说Outer没有索引类型。

游乐场链接。

Tit*_*mir 9

T[K][keyof T[K]]不起作用,因为T[K]它将是所有可能值的并集T(无论如何指定的值K),并且如果值没有公共键,则keyof T[K]可能最终会是。never

解决方案是获取并集中的每个组成部分T[K]并获取其可能的值。我们可以使用分布式条件类型来做到这一点

interface Outer {
  a: {
    b: number;
  };
  c: {
    d: string;
  };
}

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

type InnerValues<
  T extends Record<keyof T, object>,
  K extends keyof T
> = DistributiveValues<T[K]>;

type In = InnerValues<Outer, keyof Outer>; // is number|string

Run Code Online (Sandbox Code Playgroud)