将联合类型转换为交集类型[重复]
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: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 & b: 2
不是不可能的类型,它等价于a:1, b: 2
...也许you have this confusion?
我过度简化了我的情况。 “不可能”类型是 foo: a :1 & foo: b: 2
,因为 foo 将永远不会……或类似的东西。我还没有弄清楚交叉路口停止的确切点......特别是对我来说不直观。
That's not impossible either。与never
等效的不可能类型确实存在,但我还没有在这里看到。
最后一次尝试: a:1 & a:2
.
【参考方案1】:
你可以使用这个UnionToIntersection
类型:
export type UnionToIntersection<U> = (
U extends any ? (k: U) => void : never
) extends (k: infer I) => void
? I
: never
【讨论】:
这适用于指定 U 类型的情况。不幸的是,我的 U 类型是其他一些泛型,它扩展了一个已知类型,这足以破坏一些涉及从中推断的事情。以上是关于将联合类型转换为交集类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章