` 在打字稿中正确,typescript,types"/>

首页 > 解决方案 > 看不懂`排除` 在打字稿中正确

问题描述

打字稿中有类型定义:

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

我们可以使用它从另一种类型中排除一个类型:

type AB = 'a' | 'b'
type AC = 'a' | 'c'

type X = Exclude<AB, AC> 

类型Xb现在。

但是当我直接使用的内容时Exclude

type X = AB extends AC ? never : AC;

类型X不同了,不再是b了,是AC

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

标签: typescripttypes

解决方案


首先,如果您替换内容,X将是type X = AB extends AC ? never : AB;. 但这也不会给你同样的结果。

原因是条件类型在涉及裸类型参数时具有特殊行为,如果它们是联合,它们会分布在它们之上。因此,当您使用 时Exclude,工会的每个成员都分别通过条件并将结果合并。所以Exclude<AC, AB>相当于:

type X = ('a' extends AC ? never : 'a') | ('b' extends AC ? never : 'b')

除了裸类型参数(裸含义T不用于其他类型,例如元组、数组或作为其他泛型类型的参数)之外,不会发生这种分配行为,这就是为什么直接在条件中使用类型的原因不会产生相同的结果。你可以在这里阅读更多


推荐阅读