在学习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
T 是 "symbol|number|string",X 是 "string",Y 是 "number")实际上不会让这个类型工具返回 true。这是因为这个类型工具是通过对比两个泛型函数类型来工作的,而不是直接对比 T、X 和 Y。
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 的书推荐两本:
ts应该怎么学习它的用法,有推荐的吗
在 hook 里我想根据是否存入 transformData 函数,自动推导出返回的 tableData 的类型,现在的问题是,当我传入 transformData 时,tableData 的类型是 (T | R)[] , 如果我不传 transformData, tableData 的类型是 (T|(R 的默认值))[] , 如何才能在传入transformData时 tableData 得到
为什么用 > 或 < 判断就要报错啊
先说问题,renderType是一个联合类型,Shape类里面可能有一些方法,方法名必须是renderType里面的一个,然后Shape类里面需要有一个添加的方法,就是给Shape添加方法,添加的方法名也必须是renderType里面的一个,问题就出在这个添加方法customShape上,报错,说现在的类里面没有renderType的其他方法,不知道应该怎么改。
定义一个枚举,将其中一个取值作为replace方法的第二个参数,这时候会报错,该怎么处理?