TypeScript中Pick<A & B, keyof A | keyof B>和A & B的区别是什么?
问题原因解析
1. 双向extends返回true的原因
TypeScript的extends默认执行结构子类型兼容性检查,仅校验两个类型的公开属性结构是否匹配,不关心类型的构造来源:
- 交叉类型
A & B的属性集合本身就是keyof A | keyof B(也就是'a' | 'b' | 'c'),其中b属性是string & number计算得到的never类型 Pick<A & B, keyof A | keyof B>的作用就是从交叉类型中提取所有属性,生成的新对象类型和A & B的属性结构完全一致
因此双向的结构兼容性检查都会通过,返回true。
2. Equal返回false的原因
你用到的这个Equal是TS社区通用的严格类型同一性判断工具,它的实现依赖TS编译器内部的类型同一性校验规则,除了结构之外还会校验类型的原始构造形式:
A & B在TS类型系统内部属于「交叉类型」,是TS原生的复合类型Pick是映射类型工具,生成的结果属于「普通对象类型」
二者虽然结构完全一致,但在TS内部的类型节点分类完全不同,严格同一性判断自然会返回false。
核心区别
extends判断:仅校验属性结构兼容性,只要结构匹配就判定为相等- 该
Equal判断:校验类型在TS内部的完整表示,要求结构、构造来源完全一致才判定为相等
内容的提问来源于stack exchange,提问作者phill zou
相关产品推荐
相关产品推荐

