打字稿中有类型定义:
type Exclude<T, U> = T extends U ? never : T;
我们可以使用它从另一个类型中排除一个类型:
type AB = 'a' | 'b'
type AC = 'a' | 'c'
type X = Exclude<AB, AC>
类型X
现在为b
。
但是当我直接使用Exclude
的内容时:
type X = AB extends AC ? never : AC;
类型X
不同,不再是b
,而是AC
。
我不明白为什么它的行为不同。
答案 0 :(得分:4)
首先,如果您替换内容,则X
将是type X = AB extends AC ? never : AB;
。但这也不会给您相同的结果。
原因是当涉及裸类型参数时,条件类型具有特殊的行为,如果它们是一个并集,则它们将分布在它们之上。因此,当您使用Exclude
时,并集的每个成员都经过该条件,结果将被并集。因此Exclude<AC, AB>
等效于:
type X = ('a' extends AC ? 'a' : never) | ('b' extends AC ? 'b' : never)
除了裸类型参数(没有含义,T
在其他类型(例如元组,数组或作为另一泛型类型的参数)中使用)外,其他任何情况都不会发生此分配行为。在条件中直接使用类型不会产生相同的结果。您可以阅读更多here