ts的extends问题,同时求推荐ts学习文章?

在学习ts的类型的时候遇到这个问题,很是迷惑

type MyEqual<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false;

这里我理解的是判断T是否同时继承类型X,Y,从而判断X,Y是否是同一类型?(这里不理解,假如T是"symbol|number|string",X是"string",Y是:"number",岂不是得出了X与Y相同?)
还有第二个extends看上去像是判断两个数值是否相等的意思?不能用===吗?有点看不懂ts里面的extends

阅读 2.4k
2 个回答

ts 的类型运算是没有 == 运算符的吧,所以只能用 A extends B ? C : D 表达式来判断类型是否相等。这里的 extends 可以理解为 A 是否是 B 的子集,或者子类型。

这里判断两个类型是否相等和 T 的关系不大,是通过判断两个范型函数的类型是否一致,来判断 X 和 Y 的类型是否一致。

写成这样也是可以的:

type Equals<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<U>() => U extends Y ? 1 : 2) ? true : false;

Github 讨论地址

TypeScript 的书推荐两本:

  1. 阮一峰的 《TypeScript 教程》
  2. 《深入理解 TypeScript》

T 是 "symbol|number|string",X 是 "string",Y 是 "number")实际上不会让这个类型工具返回 true。这是因为这个类型工具是通过对比两个泛型函数类型来工作的,而不是直接对比 T、X 和 Y。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏