最近在看 TypeScript
相关的内容,做了一下类型体操,真的太秀啦
递归、infer
满天飞,今天就来领略一下 TS
能做什么骚操作吧!
先放上本文的几个小标题,很骚
- 巧用数组上数学课
- 模版字符串为所欲为
- 中序遍历 TS 也能行
- infer + 递归随意秒杀
下面开始军训体操
一、巧用数组上数学课
这一题是 TS 类型挑战中的 Greater Than
这道题需要我们实现 GreaterThan<T, U>
判断 T > U
是 true
还是 false
有几个特殊测试用例
GreaterThan<2, 1> //should be true
GreaterThan<1, 1> //should be false
GreaterThan<10, 100> //should be false
GreaterThan<111, 11> //should be true
看到这题,在 JS 中非常的简单,直接就能有答案,但是 TS 是没有计算能力的,也不支持大小判断
那么我们还能怎么做呢?巧用数组,通过数组的 length
来进行比较,
有两种可行的方法
- 第一种就是递归,但是通过实践我们会知道,当参数过大时,很容易爆栈
- 第二种方法就是构造两个长度为
T
和U
的数组,通过数组判断哪个数组更长
这里我们先看第一种方法
递归法
可以采用递归来实现,前面我们也有说过了,数组的很容易爆掉,但是测试用例还算温柔,这题能过
- 思路是拿一个新数组,和
T
,U
进行对比,哪个先追上新数组的长度,哪个就小 - 简单一点来说就是,两个不一样长的木棍放在一起,我们从一端开始不断往前走,先摸到的那个木棍就是短一点的
看到具体实现上
通过引入新的变量 R extends any[] = []
,来进行辅助的计算,接着依次判断 T
,U
和 R['length]
是否相等,这时候,如果 T
和 R['length
] 相等了而 U 还没有相等,那就说明了 T < U
,如果都不相等,那就继续加大数组 R
的长度
怎