flow.js/typescript 这类定义参数类型的意义何在?

动态语言的特点之一就是变量不需要提前定义。但flow.js/typescript都在做这件事情,他们背后是facebook和微软,相信做这件事肯定是有原因的。但是什么原因?不知道哪位能解释一下?
关注者
143
被浏览
10518
谢邀.

其实大家基本都有答到了, 而且打开 TypeScript 官网焦点图里第一张的标题就是 Scalable. 最近用 TypeScript 写了一个客户端编译为 JS 大概一万行的手机 web 应用. 在这个数量级上, TypeScript 带来的好处已经是显而易见的了, 我再把其他大大的答案汇总一下.

1. 静态类型检查

静态类型检查可以避免很多不必要的错误, 不用在调试的时候才发现问题 (其实有的时候根本调试不出问题, 只是默默地把坑挖了, 说不定埋的就是个炸弹, 之前用 TypeScript 重写应用的服务器端程序, 写完之后就发现了不少暂时没有影响到运行的严重问题).

2. IDE 智能提示

在 TypeScript 这一类语言之前, JavaScript 的智能提示基本完全依赖 IDE 提供的猜测 (在猜测的质量上, Visual Studio 和 brackets 是我见过的最好的). 局限性就是, 这种猜测可能并不正确, 并且也缺乏更多的辅助信息, 所以要正确使用一个类库, 得不断地在文档和 IDE 之间切换, 影响心情和效率. 而 TypeScript 不仅自己写的类库有丰富的类型信息, 也可以对其他纯 JS 项目进行类型标注 (DefinitelyTyped), 便于使用者直接在 IDE 中浏览 API, 效率大增.

而对于自己的或者团队的代码, 好处也很明显. 团队的代码自己不一定能把各种接口记得滚瓜烂熟, 自己的代码如果规模大了也很难记全, 这个时候再去翻源文件,,, 啧啧啧.

3. 代码重构

且不说我这种经常纠结变量名的会时不时看某个变量名不顺眼, 改之的情况. 有时候的确需要修改一些变量/属性/方法名, 牵涉到属性和方法的时候, 很多改动是跨文件的, 不像普通变量可以简单定位 scope, 属性方法名的重命名对于 JS 来说异常痛苦, 一方面是修改本身就不方便, 另一方面是改了还不确定该改的是不是改了, 不该改的是不是也改了. 而 TypeScript 的静态类型系统就可以较为完美的解决这个问题 (这个地方还牵涉到一些最佳实践, 就暂不深入了).

4. 可读性

对于阅读代码的人来讲, 各种便利的类型一目了然, 更容易明白作者的意图.

--

其实在 TypeScript 之前, 自己也写了一个小库 (VEJIS), 进行 JS 在运行时的类型检查/增强, 实现了诸如增强的类, 函数重载, interface, delegate 等, 结合 Visual Studio 强大的智能感知和智能感知 API 还可以方便得注释各种重载并且转化为 signatures. 不过因为有了 TypeScript, 也就没有太多存在得价值了.

之前也有同学问为毛要写这么个东西, 其实还是为了 Scalable. 就跟总有同学会问 "类在实际生产中使用多不多" 这种问题一样, 只有等到你有了需求, 才能真正体会它们的价值.