[译]不要使用TypeScript的7个原因

1,584 阅读4分钟

本文转载自Michael Krasnov的博客 7 really good reasons not to use TypeScript

大家都喜欢TypeScript,它“解决”了很多JS自身存在的问题,它是JS的“超集”,它会让你的代码更容易查错并且更容易阅读。 使用TypeScript的好处有很多,但在这里我要给大家说明一下7个不要使用TypeScript的原因。

使用TypeScript风险很大

哇,如果TypeScript提供了类型定义并且在编译期进行类型检查,甚至某些整合了TypeScript的IDE会在类型不一致的时候给你报错,使用它怎么可能会有风险呢?

正是因为如此。

TypeScript只会检查编译期的类型,并且支持已定义的类型。TypeScript对于任何网络请求、系统类库、平台提供的API以及未注明类型的第三方库完全毫无帮助。如果你习惯了只依靠编译期的类型检查、无法真正理解这些平台以及类库的代码的时候,错误和bug会悄然增生。

TypeScript代码混乱

另一个悖论:这个语言本应该为代码带来更好的清晰性和阅读性,但却反而让它更加晦涩难懂。

为了说明这一点,看看我在某个人气比较高的开源代码中找到的如下这一段范例:

createStore.ts

// TODO: 让这段代码更加优雅
;((currentReducer as unknown) as Reducer<
  NewState,
  NewActions
>) = nextReducer

这段代码摘自Redux库,这四行代码仅仅是用来将nextReducer赋值为currentReducer


Observable.ts

// HACK: 因为TypeScript默认继承静态属性
// 所以我们必须强行对抗TypeScript让对象可以有不同的静态签名
/**
 * 通过调用Observable的构造器创建一个新的Cold Observable
 * @static true
 * @owner Observable
 * @method create
 * @param {Function} subscribe? 传入Observable构造器的订阅方法
 * @return {Observable} 一个新的cold observable
 * @nocollapse
 * @deprecated 请使用 new Observable()
 */
static create: Function = <T>(subscribe?: (subscriber: Subscriber<T>) => TeardownLogic) => {
  return new Observable<T>(subscribe);
}

这一段代码摘自RxJS库。我不知道你是怎么想的,如果我需要强行对抗本该帮助我的工具,我不觉得这个工具哪里好。

TypeScript并没有解决问题

TypeScript声明它是为了解决JavaScript所具有的问题,而它却没有。

动态类型从来就不是JavaScript的问题,但是其它的一些反常现象例如 NaN === NaNfalse、可选分号、换行会导致对象定义变成作用域定义、针对OOP定义的语法糖都算实实在在的问题。

TypeScript不但没有解决这些问题,反而却定义了一系列新的规范,让JavaScript社区更加两极分化。

甚至在假定JS弱类型的特性是一个问题的情况下,TypeScript也并没有将其解决。你知道哪些语言解决了类型的问题吗?Java、C、C#以及其他编译语言。它们可以在编译期和运行期安全地定义强类型,但解释型语言根本不可能做得到。

TypeScript不是超集,而是子集

TypeScript是一个最终需要编译为JavaScript的语言,从定义上来说这就不可能是JavaScript的超集。它限制了你可以用JavaScript能做到的事情,它在遮蔽了JavaScript的优点的同时遮蔽了你的双眼。

如果你真的想成为一个优秀的开发者,不要被TypeScript带来的谎言所蒙蔽,尝试去理解JavaScript,释放其无穷的可能性。

TypeScript是开源的,但仅此而已

很多人使用TypeScript的理由是因为他是开源的。这句话不假,TSC的确是发布在MIT许可之下的。但它始终是被微软所控制的——一个巨型的垄断企业。它所谓的“开源”只不过是为了占领市场的一个噱头。不要把开源和民主画上等号:微软始终对TypeScript拥有完全的控制权,你也只有看着的份。

而另一方面,JavaScript,是被一个国际委员会(译者注:tc39)所维护的,没有社区的同意,他们不会对JavaScript作任何更改。

但是很多大公司都在用……

我都不知道为什么有人会把这个当成理由。大公司到现在还在维护祖传代码、各种偷税漏税甚至歧视女性。为什么突然他们在用TypeScript就成了我们学习的榜样了?

但是它有更多的功能……

不再如此了。

的确,当TypeScript在2012年刚面世的时候,它有类(Class)的概念,当时JavaScript还没有。但是JavaScript已经走过了很长的路,而TypeScript却难以跟上JavaScript的脚步。如果JavaScript少了什么,背后甚至还有Babel给它撑腰。