如何从对象联合类型中获取指定属性的取值类型
实现获取联合类型指定属性的取值类型
你可以利用TypeScript的分布式条件类型来实现ValueOfObject,具体代码如下:
type ValueOfObject<T, K extends PropertyKey> = T extends T ? K extends keyof T ? T[K] : undefined : never;
验证你的示例
结合你定义的类型:
interface A { a: number b: string c: string } interface B { a: string b: string } type C = A | B
使用ValueOfObject的结果完全符合预期:
type aValues = ValueOfObject<C, 'a'>→number | stringtype bValue = ValueOfObject<C, 'b'>→stringtype cValues = ValueOfObject<C, 'c'>→string | undefined
原理说明
- 分布式条件类型:
T extends T会触发TypeScript的分布式特性,把联合类型T拆分成单个成员(这里就是A和B)分别处理。 - 属性存在性检查:对每个拆分后的成员,判断
K是否属于该成员的键(K extends keyof T):- 如果存在,直接取该成员的
K属性类型T[K]; - 如果不存在,返回
undefined(因为联合类型中部分成员没有该属性,访问时可能得到undefined)。
- 如果存在,直接取该成员的
- 自动联合结果:所有成员的处理结果会自动合并成一个联合类型,就是最终的属性取值类型。
你之前实现的KeysOfUnion也是利用了同样的分布式条件类型思路,只是这里进一步扩展到了属性值的获取。
内容的提问来源于stack exchange,提问作者Dawid Kisielewski
相关产品推荐
相关产品推荐

