无法正确理解打字稿中的`Exclude <t,u =“”>`

时间:2018-10-14 07:55:39

标签: typescript types

打字稿中有类型定义:

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

我不明白为什么它的行为不同。

1 个答案:

答案 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