我的问题类似于来自 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没有索引类型。
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)
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |