极光日报
首发于极光日报

为什么 Reddit 选择了 TypeScript?

简评:题图里这个很骚气的字体叫 'Operator Mono'。

在今年开年的时候,Reddit 的 CEO - Steve 决定要重新设计 reddit(终于要重新设计了)。之后他们开始考虑各种各样的问题,不过首先要回答的就是「该用什么语言」?

当然了,最终你选择的语言最后都会被编译成 JavaScript,但如果开发过程中选对了语言对开发效率的提升还是很大的。下面就是我们当时的一些选择:

  1. Bucklescript
  2. ClojureScript
  3. Coffeescript
  4. Elm
  5. Elixirscript
  6. Javascript 2016 and beyond
  7. Javascript + annotations
  8. Nim
  9. PureScript
  10. Reason
  11. TypeScript

每种语言都有自己的优、缺点,因此我们先明确了自己的几点需求:

  1. 要支持强类型
  2. 要有很好的配套工具
  3. 已经有了成功案例
  4. 我们的工程师可以很快上手
  5. 能同时工作于客户端和服务器
  6. 有优秀的类库

在考虑了这些需求之后,我们的最佳选择似乎只有 Typescript 或者 JavaScript + Flow 了。在我们进行选择之前,先了解下它们的区别在哪里。

Compilation vs Annotation

Typescript 和 Flow 的一个主要区别在于,Typescript 是 JavaScript 的强类型版本,而 Flow 是通过一组可以添加到 JavaScript 的注解,然后通过工具检查正确性。 比如对于 enum 的写法:

Typescript

enum VoteDirection {
  upvoted = 1,
  notvoted = 0,
  downvoted = -1,
};
const voteState: VoteDirection = VoteDirection.upvoted;

Flow

const voteDirections = {
  upvoted: 1,
  notvoted: 0,
  downvoted: -1,
};
type VoteDirection = $Keys<typeof voteDirections>;
const voteState: VoteDirection = voteDirections.upvoted;

在 Reddit 中我们用 Babel 来做转码,其中有一些我们想要保留的优化,而 TypeScript 自有的编译过程可能会给我们造成麻烦。所以,我们需要调整我们的构建步骤来集成 TypeScript,从而保证不会破坏已有的很多东西。

相比起来,Flow 的类型注解能自动的被 Babel 移除,如果我们采用 Flow,那我们的构建步骤能保持尽量简单。

正确性

普遍认为 Flow 在类型正确性上要做得更好。Flow 默认不允许 nullable 类型,而 TypeScript 在 2.x 才开始支持。并且 Flow 能更好的推断出类型,而 TypeScript 往往会回退到 'any' 类型。

这里给一个关于数组的例子:

Flow

class Animal {}
class Bird extends Animal {}

const foo: Array<Bird> = [];

foo.push(new Animal());
/*
foo.push(new A);
        ^ A. This type is incompatible with
const foo: Array<B> = [];
                ^ B
*/

Typescript

class Animal {}
class Bird extends Animal {}

const foo: Array<Bird> = [];

foo.push(new Animal()); // ok in typescript

这样的例子网上还有很多,但普遍的共识是,与 TypeScript 相比,Flow 在类型检查中做得更好。

生态系统

到现在为止,Flow 能让我们有更简单的构建过程,更好的类型检查,那为什么最后还是选了 TypeScript 呢?

TypeScript 的一大加分项就是其生态系统,TypeScript 的支持库实在是太棒了。我们用到的所有库都被收录于 DefinitelyTyped,都有着很好的质量。

并且还支持目前流行的编辑器,比如 VSCode, Atom 和 Sublime Text。此外,TypeScript 还支持解析 JSDoc,这真的特别有用。

目前也已经有了不少使用 TypeScript 的成熟项目,包括 VSCode,Rxjs 和 Angula。所以,我们相信它的功能能够满足我们的产品需要。另外,我们对 Flow 的一个忧虑在于 Flow 是为了解决 Facebook 的具体需求而建立的,所以它的未来发展会更多的受制于 Facebook 的业务需求。

总结

我们选择 Typescript,因为我们有信心我们的工程师可以快速上手(去年里我们的工程师数量增加了一倍)。但更重要的它是强类型的,这样我们的代码有更少的类型相关 bug,更容易构建大型应用,还有着丰富的生态系统。总之,我们很满意我们的选择。

原文:Why We Chose Typescript

日报扩展阅读:

换一个角度思考如何给日志分级 - 知乎专栏

欢迎关注:知乎专栏「极光日报」,每天为 Makers 导读三篇优质英文文章。

发布于 2017-07-06

文章被以下专栏收录

    简介:每日导读(或翻译)三篇优质英文文章,内容 80% 涉及硅谷/编程/科技/,期待共同成长。