在浏览TypeScript挑战时,我遇到了一个特别有趣的例子:如何将一个联合点转换为一个十字路口。
我自己也搞不清楚,于是我转向解决方案,在那里我找到了一种很好的方法-- 这里和@jcalz给出的这里更好的解释。
我唯一的问题是这个问题:实际上,一个用户试图在多个单独的语句中分解解决方案,而令我惊讶的是,结果却不一样。我们得到的不是foo & bar,而是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'这里发生了什么事?type I和type C不应该是一样的吗?
发布于 2022-10-09 09:09:47
发布于 2022-10-09 09:11:04
分布条件类型用于(裸)参数类型。
替换你的
type B = A extends any ? (arg: A) => any : never // (arg: A) => any;使用
type BT<T> = T extends any ? (arg: T) => any : never;
type B = BT<A>看到不同之处
https://stackoverflow.com/questions/74003303
复制相似问题