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

Posted

技术标签:

【中文标题】获取 TypeScript 中双嵌套对象的所有值类型【英文标题】:Get all value types of a double-nested object in TypeScript 【发布时间】:2020-01-20 17:21:27 【问题描述】:

我的问题类似于Types from both keys and values of object in Typescript,但多了一层嵌套:

interface Outer 
  a: 
    b: number
  ,
  c: 
    d: string
  

我只想检索所有值的联合类型,这里是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

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

Playground link.

【问题讨论】:

【参考方案1】:

T[K][keyof T[K]] 将不起作用,因为T[K] 将是T 中所有可能值的联合(以及K 指定的值),如果keyof T[K] 可能最终成为never值没有公共键。

解决方案是获取联合 T[K] 中的每个成分并获取其可能值。我们可以使用distributive conditional type 来做到这一点

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

play

【讨论】:

是否可以进行递归,以便在任意深度的对象嵌套中为您提供所有非Record 叶值类型的联合?例如,如果Outer 中的属性d 是对象而不是字符串。

以上是关于获取 TypeScript 中双嵌套对象的所有值类型的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:推断嵌套联合类型的类型

Typescript 无法检查函数返回类型的嵌套对象

如何根据 Aurelia/Typescript 中的嵌套属性对对象数组进行排序

在 Typescript 中过滤嵌套数组对象的数组

如何获取与 Typescript 中的接口匹配的对象的所有属性? [复制]

如何在节点获取标头中使用嵌套对象/数组表示法?