typescript - 看不懂`排除` 在打字稿中正确
问题描述
打字稿中有类型定义:
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
。
我不明白为什么它的行为不同。
解决方案
首先,如果您替换内容,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
不用于其他类型,例如元组、数组或作为其他泛型类型的参数)之外,不会发生这种分配行为,这就是为什么直接在条件中使用类型的原因不会产生相同的结果。你可以在这里阅读更多
推荐阅读
- oracle11g - 如何通过减去两个日期从计算时间中删除纳秒?
- swift - 未调用类扩展 - 无法在地图上配置注释
- java - TypeToken 对象在服务器中显示不正确
- msmq - 从 Microsoft 消息队列获取消息的延迟
- python - Dyna-Q 有什么问题?(Dyna-Q 与 Q 学习)
- java - Apache-camel 解压文件破坏图像
- c# - 如何将 Quaternion.RotateTowards() 限制为仅顺时针旋转
- asp.net - 在 IIS 中部署 Angular 9 .NET Core 模板
- javascript - 如何从反应原生的不同js文件中获取图像URL
- assembly - 如何在 Linux 中编译 X86 程序集并调用其函数