事情是酱紫的...
昨天我写了一篇前端为什么要使用 JS 刷算法的感悟文章,然后屁颠屁颠去算法群里求关注,求点赞,然后有大佬就问我以上的问题,这个其实也确实考虑过,所以我就来了。
细心的小伙伴会发现,我的题目是 为什么我不用 TS 刷算法
,而不是不推荐用 TS 刷算法,这是因为, 用 TS 刷算法的好坏区分我暂时还不能下个定论,而且在不同阶段可能解读不一样,所以我只能讲讲为什么我不去用 TS 刷算法。
不用 TS 的自身原因
用 TS 刷算法,那是需要编译的
我有一个梦想,梦想 LC 让我测试的时候秒开,但是那只是一个梦想;所以没有钱冲会员的我,经常会在 VSCode 中直接本地测,酱紫可以快很多;据说一些插件可以实现,但是懒如我就只用原生,然后用 node 去运行,辣么问题来了,如果我用 TS 写,我还得先 tsc 一下,然后再执行;emm... 这就有点难为我了。
用 TS 写类型,会分散注意力
作为一个可能患有小儿多动症的我,注意力的培养是持续至今的难题,无法分心二用是至今的痛,比方说我就很羡慕隔壁小鑫可以边看电视边写论文,而且效率贼高。
单一原则可能是我保持专注唯一的办法了,就是尽可能少的干扰我去做一件事,否则就会注意力跑偏,然后思维紊乱。所以当我尝试用 TS 写算法的时候,我发现我对于一些入参的编写,对于返回值的判断会分散我对算法解题的思路。
以前我只需要读题,理解一下,看看测例,然后就可以分析边界;现在是看看题目,想想入参到底是个什么鬼,想想返回值的格式 -- 当然如果是简单题还好,但是如 LRU 缓存
这种题目,写起 TS 类型来说就有点累了。
TS 写算法有什么看上去的好处呢?
当我打算用 TS 重写算法的时候,我就好好的忽悠了自己一把:一份时间,既可以学算法,有可以学 TS,而且用 TS 做了限制还能降低算法的错误,一次性满足两个愿望,它不香吗?
然后我发现我对 TS 误解了;
- 首先我要做的是算法,所以首要任务是把题给跑通,不然一切休提,而用 TS 写首先就增加了我完成算法的工作量
- 其次 TS 主要功能之一是限制变量属性,防止在使用过程中,错用不同类型的 api,并给出相应的提示,最典型的就是 undefined 等值报错,但是在算法中,起码在 LC 的算法中,一般这些条件都是给出来的,清晰明了且在一道题中一般不会混淆,所以这个特性在算法中基本用不到
- 再次, TS 可以根据定义好的接口,在使用变量的时候,直接发出提示,比方说如果是数组,它就会把挂载在数组上的方法提示给你;但是你在写算法的时候,要不就不太直接使用 api 接口(比方说排序直接用 sort),要不就是本身就为了熟悉 api(总不能让在白板上写的时候,你让它给你个 TS 提示吧)。因此 TS 对于类型属性提示的功能感觉也用不上。
- 最后,我们想要提升 TS, 在算法中可能也就定义几个 interface,对于泛型等高级用法用到的也不多,所以基本达不到锻炼 TS 升级效果,反而有画蛇添足之意
在面试中用 TS 会加分吗?
作为一个只会吹牛皮的厨子,我不晓得大厂面试官会不会加分,但是我用 TS 写我就觉得很浪费对方时间。
在上一篇文章中我说到,用 JS 写算法可以使用一些面试官想了解,但是又不好单独提问的 JS 特性或者 api,比方说数组的 reduce,weakMap,...
等,按道理说用 TS 也能达到加分效果才对。
但是别忘了,JS 是实现语言,而 TS 是 JS 的超集,如果要考察 TS, 那么肯定不会因为定义了几个简单的 interface 或者 type 就给加分,而用 TS 写明显会增加时间成本,大家都想早点回去休息,你做个人吧
综上,我觉得用 TS 写算法,效率不高,开发用户成本不佳(还得编译或者加插件),边际效益不高,所以暂时放弃了。
说了那么多不好的,能说点好的吗
当然了,如果对于 TS 熟练,而且不是为了练习 TS 而用的大佬来说,TS 当然还是很好用的,比方说我经常会对 String 类型使用 Array 的方法,这个时候 TS 就会来提示你了。
其次,对于我来说复杂的类型编写题 LRU
, 正好可以用 TS 将对应的 I/O 捋清楚,这个时候也能达到秀技和复习 TS 的效果。
最后
TS 是 JS 的超集,帮助我们限制一些运行时的错误,而做算法的时候,一般要求我们考虑一切的边际,防止出错,这个时候属于思维上的锻炼,当然可以借助工具的帮助,但是这样就会降低训练的效果了。
但是对于一些熟练的题目,改用 TS 写可能对复习效果更佳,可能之前使用 JS 的隐性转换胡来,现在相当于加了沙袋跑步,能够进一步强化对题目的认知,是一种强化训练。
所以,对于刚开始刷题的前端,还是不太建议上来就用 TS 刷题,这样很可能两头不讨好,两头都没加强;还是一心一意用 JS 刷算法吧。
以上观点还是受到一位大神的一篇文章xxx不建议在学习React的时候学习 TS
, 名字忘记了,写字的时候去找也没找到,希望有人可以给一下链接;大意就是不要在初学 React 的时候,用 TS 版本的 CRA,想着可以 TS 和 React 一起学,因为本身两者都比较复杂,任意学习一样都得全身心,而如果混在一起,就会扰乱思绪,反而使得代码更加复杂晦涩难懂,提高我们学习的边际成本,进而有可能放弃学习。
最后,无论用啥刷算法,其实重要的刷,重要的是持续;我进坚持的 144 天,用到的原理就是 最小消耗原理
, 尽量用自己舒服的消耗来培养自己的习惯,让它成为每天必备而又不会耗费太多的精力,这样进可以加大投资,退也不会一无所有;所以股票需谨慎,抄币毁一生,若为赢通胀,基金价更高
;愿天台再无需上锁,阿门。。。