代码如下:
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的交集。
请问这该如何理解?
要想conditional types生效则必须得保证extends左边的类型必须出现在类型参数列表中也就是
<...>
中所以可以把c改写成
详情看这篇文章的 Refining unions with distributive conditional types 部分
https://artsy.github.io/blog/...