w3ctech

JavaScript 的生产力工具: TypeScript

TypeScript 目前已经迭代到 1.4 版本, 即将到来的 1.5 又搭载了更多好用的特性, 包括与 Angular 团队合作增加的装饰器 (Decorators).

很高兴的是看到国内不少一线前端对 TypeScript 还是抱以比较积极的态度, 但也有很多同学提出了一些质疑和批评. 我写这篇文章的目的就是希望能以自己的理解对常见的误解做一个说明.

TypeScript 是前端工程师的工具

很多同学会认为 TypeScript 是为了吸引 (或者只能吸引) 一些掌握了 C#/Java 的后端工程师. 但事实上, TypeScript 的初衷我想是为了适应更大规模的 Web 应用前端开发 (当然, 它也可以被用到 NodeJS 上).

经常会看到有同学把 TypeScript 和 CoffeeScript 放在一起比较, 我认为是不大恰当的. TypeScript 是 JavaScript + 类型系统, 而 CoffeeScript 是 Python/Ruby 口味的 JavaScript. 进入两个项目的官网, 很容易就可以从它们宣传的重点上看出区别.

TypeScript 是为了解决 Scalable 的问题. 而对于 CoffeeScript, 我想很大程度上是因为作者认为:

Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart.

但老实说我挺喜欢 JavaScript 的语法风格.

TypeScript 是 JavaScript 的工具

文章标题其实很明确地表达了我对 TypeScript 的看法, 它 (确切地说是 TypeScript 的中的 Type) 是 JavaScript 的工具, 不应该被作为一门新的语言来对待.

灵活 vs 健壮

有同学说, 就喜欢 JavaScript 弱类型的灵活, 认为在 JavaScript 上加上类型会削弱这种灵活性. 我自己虽然不是 JavaScript 入门编程的, 但第一门精通的语言还是 JavaScript, 它也是我最喜欢的语言之一. 我也非常理解这样的心情: 本来直接 return 一个对象字面量就可以, 现在非要我去定义一个 interface, 这不是没事找事么.

确实, 对于一个规模不大的项目来说, 直接书写我们熟悉的 JavaScript 也不容易出错, 并且更加灵活. 但是, 如果我们将项目规模扩大: 一方面由于 JavaScript 弱类型的性质, 一些 Lint 能够检测到一部分问题 (比如局部变量的命名和使用), 却在更多的时候无能为力 (比如对象属性); 团队之间的协作花费大量时间查阅文档; 如果需要重构代码, 重命名, 都费时费力, 还可能留下大量隐患. 这个时候再想想 C# 和 Java, 是不是会觉得爽歪歪了.

而且, 针对 JavaScript 的特点, TypeScript 有一个类型 any, 并且在 1.4 中增加了联合类型 (Union Types) 以及配套的类型收窄 (Type Guards), 一方面尽可能地保留 JavaScript 的灵活性, 另一方面也将静态类型语言在工程上的优势保留下来.

比如:

function foo(strs: string|string[]) {
    if (typeof strs === 'string') {
        // it's a string
    } else {
        // it's an array
    }
}

总之, 灵活是好事, 但是也不必排斥 TypeScript 的类型系统, 毕竟确实在规模较大的项目上, 它对于代码健壮性的价值是显而易见的.

编程风格

也有同学说喜欢 JavaScript 的多范式编程风格. 毕竟 JavaScript 也算大半个函数式编程语言, TypeScript 会不会削弱了 JavaScript 函数的地位呢? 当然不会. F#/Haskell 也有类型系统, 但它们都是不折不扣的函数式编程语言.

静态类型与编程风格并不冲突, 不仅如此, TypeScript 还能让 ES3/5 提早用上 ES6 的箭头函数 (Arrow Function), 函数式编程更加畅快了.

未来

我想 Angular 2 宣布使用 TypeScript 对于其生态可谓是非常重要的一笔. 同时微软谷歌两家联手, 也为 ES7 中类型的回归 (ES4 的流产) 埋下了伏笔. JavaScript 之父 Brendan Eich 也在 Twitter 上表示:

Everyone wants types. I was clearly ahead of time with ES4.

现在开始写 TypeScript 吧!

--

我在 GitHub 上创建了 TypeScript 中文指南, 希望能帮有兴趣的同学快速入门. 目前还在编写中, 如果大家有什么希望看到的内容或者自己的想法欢迎创建 issue.

w3ctech微信

扫码关注w3ctech微信公众号

共收到4条回复

  • 在合适的地方去用,它就是好的。 项目大了类型的判断很恶心,还能节省不少代码

    回复此楼
  • 连续提交存在bug诶……

    回复此楼
  • 我查一下,我记得之前有修过

    回复此楼
  • 一直很关注这个

    回复此楼