将联合类型转换为交集类型[重复]

Posted

技术标签:

【中文标题】将联合类型转换为交集类型[重复]【英文标题】: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:1b: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 . 【参考方案1】:

你可以使用这个UnionToIntersection类型:

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

【讨论】:

这适用于指定 U 类型的情况。不幸的是,我的 U 类型是其他一些泛型,它扩展了一个已知类型,这足以破坏一些涉及从中推断的事情。

以上是关于将联合类型转换为交集类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

打字稿将联合转换为交集[重复]

如何将 c++ 联合类型转换为 c# 代码? [复制]

打字稿:将标记的联合转换为联合类型

如何将元组类型转换为联合?

将对象转换为联合类型

在 apollo-server 中将网关上的联合类型转换为服务 GraphQL 中的标量类型