当前位置: 首页 > 知识库问答 >
问题:

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

南门烈
2023-09-07

在学习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个答案

秦权
2023-09-07

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

司马弘益
2023-09-07

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》
 类似资料: