获取 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 中双嵌套对象的所有值类型的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 Aurelia/Typescript 中的嵌套属性对对象数组进行排序