首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

交交
EN

Stack Overflow用户
提问于 2022-10-09 08:43:45
回答 2查看 79关注 0票数 2

在浏览TypeScript挑战时,我遇到了一个特别有趣的例子:如何将一个联合点转换为一个十字路口

我自己也搞不清楚,于是我转向解决方案,在那里我找到了一种很好的方法-- 这里和@jcalz给出的这里更好的解释。

我唯一的问题是这个问题:实际上,一个用户试图在多个单独的语句中分解解决方案,而令我惊讶的是,结果却不一样。我们得到的不是foo & bar,而是foo | bar。将解决方案以“一行”的形式组合在一起,结果将得到“恢复”:foo & bar

代码语言:javascript
运行
复制
// 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 Itype C不应该是一样的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-09 09:09:47

实际上,用户试图在多个单独的语句中分解解决方案。

用户犯了一个错误。在原始类型中,U是一个泛型类型,它在条件中获取分布式

B中,您使用的不是泛型类型的A。不进行分发。

如果我们将B修改为也有一个泛型类型U (我们只是默认为A),我们将看到相同的结果never

代码语言:javascript
运行
复制
type B<U = A> = U extends any ? (arg: U) => any : never 
type C = B extends ((arg: infer I) => void) ? I : never 
//   ^? never

游乐场

票数 2
EN

Stack Overflow用户

发布于 2022-10-09 09:11:04

分布条件类型用于(裸)参数类型。

替换你的

代码语言:javascript
运行
复制
type B = A extends any ? (arg: A) => any : never // (arg: A) => any;

使用

代码语言:javascript
运行
复制
type BT<T> = T extends any ? (arg: T) => any : never;
type B = BT<A>

看到不同之处

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74003303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档