鉴于我有以下选项
类型
interface Options {
parent1: {
child1: {
foo: 'bar'
}
};
parent2: {
child2: {
baz: 'daz'
}
};
}
在这种情况下,如何将它变成所有二级子属性值的联合
{ foo: 'bar' } | { baz: 'daz' }
我尝试了以下方法
type KnownOptions = Options[keyof Options][keyof Options[keyof Options]];
但这只有在二级子属性在所有顶级属性中都相同时才有效。例如。当我将 child2
重命名为 `child1
最佳答案
您可以使用映射类型来获取嵌套类型:
type KnownOptions<T> = T extends {
[k in keyof T]: {
[k: string]: infer OptionValue
}
} ? OptionValue : never
// Good:
const a: KnownOptions<Options> = { foo: 'bar' }
const b: KnownOptions<Options> = { baz: 'daz' }
// Expect errors:
const c: KnownOptions<Options> = { foo: 'bad value' }
const d: KnownOptions<Options> = { badKey: 'bar' }
这是一个通用类型,它接受具有两级键的类型。条件类型(由三元 T extends Type ? A : B
表示)表示“如果通用类型 T 是至少 2 级深度的对象,则返回第二级中每个级别的类型. 否则,返回never
类型,因为泛型类型无效。
infer OptionalValue
表示“无论此处是什么类型,都将其保存为 OptionValue
”。在将多个类型保存到它之后,它由条件类型返回,创建每个类型的联合。
我不得不承认,我不完全确定为什么第一级 key 需要是 k in keyof T
但第二级可以只是 k: string
.但是,这是我让它正常工作的唯一方法。
关于typescript - 从具有不同键的嵌套对象的值创建联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61281041/