浏览TypeScript challenges时,我遇到了一个特别有趣的:How to turn a union to an intersection .
我自己无法弄清楚,我转向解决方案,在那里我找到了一个很好的方法 here并给出了更好的解释 here作者:@jcalz。
我遇到的唯一问题是 question :实际上,用户尝试将解决方案分解为多个单独的语句,令我惊讶的是,结果并不相同。我们得到的是 foo | 而不是
。将解决方案作为“一行”重新组合在一起,结果就会“恢复”:foo & bar
栏foo & bar
。
// Type definition
type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends ((arg: infer I) => void)
? I
: never;
// As expected 👍 ('foo' & 'bar' is never)
type I = UnionToIntersection<'foo' | 'bar'>; // never
// Let's break-down `UnionToIntersection`
type A = 'foo' | 'bar';
type B = A extends any ? (arg: A) => any : never // (arg: A) => any;
// This should have been 'foo' & 'bar' (never) just like `type I` 🤯
type C = B extends ((arg: infer I) => void) ? I : never // 'foo' | 'bar'
这是怎么回事? I 型
和C 型
不应该是一样的吗?
最佳答案
effectively a user tried to break down the solution in multiple separate statements
用户犯了一个错误。在原始类型中,U
是一个泛型类型,它获取 distributed在条件中。
在B
中,您使用的A
不是泛型类型。不进行任何分发。
如果我们修改 B
使其也具有泛型类型 U
(我们默认为 A
),我们将看到相同的结果结果从不
。
type B<U = A> = U extends any ? (arg: U) => any : never
type C = B extends ((arg: infer I) => void) ? I : never
// ^? never
关于typescript - 并集到交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74003303/