【问题标题】:Convert Union type to Intersection type [duplicate]将联合类型转换为交集类型[重复]
【发布时间】:2021-09-03 15:16:38
【问题描述】:

我正在尝试将联合类型转换为交集类型:

type UnionToIntersection<U> = // unknown code

type test = UnionToIntersection<{a: 1} | { b: 2}>
// typeof test should be {a: 1} & { b: 2}, an impossible type

这只是更大类型函数中的一步,它将合并{a:1}{b:2} 的属性以生成{a:1, b:2}。但这是后面的步骤。

第一步是我需要将我的并集转换为交集。我该怎么做?


对于那些想知道的人,它将进入:

export type SubpropertyMerge<T> = (
  T extends (...args: infer A) => infer R ? (
    (...args: A) =>  R
  ): (
    T extends object ? (
      T extends string | number | ((...args: any) => any) | symbol | boolean ? T
      : { [K in keyof T]: SubpropertyMerge<T[K]> }
    ) : T
  )
);

// SubpropertyMerge<{a: 1} & { b: 2}> === {a:1, b:2}

【问题讨论】:

  • 我倾向于将其作为this question 的副本关闭,除非您能表达出不同之处。旁注:{a: 1} &amp; {b: 2} 不是不可能的类型,它等价于{a:1, b: 2}...也许you have this confusion
  • 我过度简化了我的情况。 “不可能”类型是{ foo: {a :1}} &amp; { foo: {b: 2}},因为 foo 将永远不会……或类似的东西。我还没有弄清楚交叉路口停止的确切点......特别是对我来说不直观。
  • That's not impossible either。与never 等效的不可能类型确实存在,但我还没有在这里看到。
  • 最后一次尝试:{ a:1 } &amp; { a:2 }.

标签: typescript types union intersection


【解决方案1】:

你可以使用这个UnionToIntersection类型:

export type UnionToIntersection<U> = (
  U extends any ? (k: U) => void : never
) extends (k: infer I) => void
  ? I
  : never

【讨论】:

  • 这适用于指定 U 类型的情况。不幸的是,我的 U 类型是其他一些泛型,它扩展了一个已知类型,这足以破坏一些涉及从中推断的事情。
猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2021-01-11
  • 1970-01-01
  • 2010-10-07
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多