typescript中泛型和普通类型使用extends进行操作的返回类型为什么不相同?

发布于 2022-09-12 23:28:14 字数 497 浏览 10 评论 0

代码如下:

  type a = 1 | 2 | 3;
  type b = 1 | 2;

  type Exclude<T, U> = T extends U ? never : T;

  type d = Exclude<a, b>;

  type c = a extends b ? never : a;

  let x1: c = 1; // type c = 1 | 2 | 3
  let x2: d = 3; // type d = 3

同样是T extends U ? never : T,为什么c和d的类型不一样?

我参阅的文章中有这样一句话:

注意,生成的结果是分配式的。
举个例子,如果我们把X换成T,如此形式:T extends U? T: never。
此时返回的T,是满足原来的T中包含U的部分,可以理解为T和U的交集。

请问这该如何理解?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

漫漫岁月 2022-09-19 23:28:14

要想conditional types生效则必须得保证extends左边的类型必须出现在类型参数列表中也就是<...>
所以可以把c改写成

type c<A> = A extends b ? never : A;

let x1: c<a> = 3

详情看这篇文章的 Refining unions with distributive conditional types 部分
https://artsy.github.io/blog/...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文