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

代码如下:

  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的交集。

请问这该如何理解?

阅读 1.8k
1 个回答

要想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/...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题