简评:题图里这个很骚气的字体叫 'Operator Mono'。
在今年开年的时候,Reddit 的 CEO - Steve 决定要重新设计 reddit(终于要重新设计了)。之后他们开始考虑各种各样的问题,不过首先要回答的就是「该用什么语言」?
当然了,最终你选择的语言最后都会被编译成 JavaScript,但如果开发过程中选对了语言对开发效率的提升还是很大的。下面就是我们当时的一些选择:
- Bucklescript
- ClojureScript
- Coffeescript
- Elm
- Elixirscript
- Javascript 2016 and beyond
- Javascript + annotations
- Nim
- PureScript
- Reason
- TypeScript
每种语言都有自己的优、缺点,因此我们先明确了自己的几点需求:
- 要支持强类型。
- 要有很好的配套工具。
- 已经有了成功案例。
- 我们的工程师可以很快上手。
- 能同时工作于客户端和服务器。
- 有优秀的类库。
在考虑了这些需求之后,我们的最佳选择似乎只有 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 导读三篇优质英文文章。