【问题标题】:How to merge properties from union of objects如何合并对象联合中的属性
【发布时间】:2019-04-27 15:57:06
【问题描述】:

我可以通过type UnionKeys<T> = { [Key in keyof T]: Key }[keyof T]得到一个联合的所有键

type MyUnion = {x: 'a', y: 'b'} |  {x: 'aa', z: 'c'}
type T1 = UnionKeys<MyUnion> // 'x' | 'y' | 'z'

如何获得联合的合并类型?

type MergedUnion<T> = ?????
type T2 = MergedUnion<MyUnion> // `{x: 'a' | 'aa', y: 'b', z: 'c'}`

【问题讨论】:

  • 即使UnionKeys 也无法按预期工作。 UnionKeys&lt;MyUnion&gt; 就是 'x'(和你使用普通的 keyof MyUnion 一样)
  • 你从哪里得到UnionKeys 的定义?它似乎不起作用
  • type UnionKeys&lt;T&gt; = { [Key in keyof T]: Key }[keyof T] 是我的自制软件。它会在 3.4.3 和 3.5-dev 上产生 'x' | 'y' | 'z',但我更喜欢你的版本。

标签: typescript


【解决方案1】:

这是可以做到的。我们映射UnionKeys(我使用了不同的定义,使用分布式条件类型),我们使用另一个分布式条件类型来提取特定键可以具有的所有值的联合:

type MyUnion = {x: 'a', y: 'b'} |  {x: 'aa', z: 'c'}
type UnionKeys<T> = T extends unknown ? keyof T : never;
type UnionValues<T, K extends PropertyKey> = T extends Record<K, infer U> ? U: never;
type MergedUnion<T> = { [P in UnionKeys<T>]: UnionValues<T, P> }

【讨论】:

  • 不错!你能解释一下为什么T extends unknown ? keyof T : never 的行为与普通的keyof T 不同吗?
  • @AlekseyL。由于分布式条件类型,您可以在此处阅读stackoverflow.com/questions/51651499/…。很抱歉,我已经写了很多次分发的解释,一想到要再写一次,我的手指就会反抗:))。
猜你喜欢
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多