39

放弃 TypeScript 的 7 个非常好的理由

 4 years ago
source link: https://juejin.im/post/5e4f711b518825490761eb2f
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文翻译自 Michael Krasnov 的 7 really good reasons not to use TypeScript,请参考原文阅读

很多人都喜欢 TypeScript。它“解决”了 JS 的许多问题,是 JS 的一个“超集”,它将使代码易于阅读。有很多使用 TypeScript 的理由,但是我将给您 7 个不使用 TypeScript 的理由。

TypeScript 有风险

TypeScript 添加类型定义并在编译时检查类型,怎么会有风险?IDE 集成还会警告您有关类型不匹配的信息。不过问题也在这。TypeScript 仅在编译时检查类型,并且仅检查可用的类型。任何网络调用、系统库、特定于平台的 API 和无类型的第三方库都无法与 TypeScript 通信。当您习惯了类型检查并不必完全了解代码和平台时,错误和 BUG 就会显现出来。

使用 JS,您无需对类型做任何假设,并且可以检查变量的具体值以确保它是否是您期望的值。或者,如果您在这种情况下不关心其类型,则不必做什么。在 TS 中,您依赖编译器为您完成此任务,但是它只能检查这么多。您可以将这两种方式结合起来,但那又有什么意义呢? 如果要花时间编写定义,然后花时间编写代码以确保在运行时检测类型,那么为什么要预先去写类型呢?

TypeScript 太乱了

另一个悖论:本应为代码库带来清晰度和可读性的语言反而使代码更加模糊。为了说明我的意思,请查看一些我在一些流行的开源库中找到的示例:

// TODO: do this more elegantly
;((currentReducer as unknown) as Reducer<
  NewState,
  NewActions
>) = nextReducer
复制代码

这是来自 Redux 库的,所有这 4 行代码的目的是将 nextReducer 赋值给 currentReducer。

// HACK: Since TypeScript inherits static properties too, we have to
// fight against TypeScript here so Subject can have a different static create signature
/**
 * Creates a new cold Observable by calling the Observable constructor
 * @static true
 * @owner Observable
 * @method create
 * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
 * @return {Observable} a new cold observable
 * @nocollapse
 * @deprecated use new Observable() instead
 */
static create: Function = <T>(subscribe?: (subscriber: Subscriber<T>) => TeardownLogic) => {
  return new Observable<T>(subscribe);
}
复制代码

这一个示例来自 RxJS 库。我不知道你是怎么想的,但是如果我必须使用一种工具,那么我认为这并不是一个好工具。

TypeScript 没有解决问题

据说 TypeScript 可以解决 JavaScript 的问题。但事实并非如此。 动态类型从来都不是 JavaScript中 的问题,但是许多其他陷阱,例如 NaN===NaN 为false、分号为可选或非可选、换行符将对象定义更改为作用域、使用语法糖代替 OOP 等等这些确实是问题。TypeScript 并没有解决这些问题,而是引入了另一个标准,进一步分化了 JS 社区。

即使所假定的 JS 中缺少类型是一个问题,TS 也无法解决它。如何才能解决?只能是 Java,C,C#和其他编译型语言。他们可以安全地在编译时和运行时保证强类型。翻译型语言无法做到这一点。

TypeScript不是超集,而是子集

TypeScript 是可以编译为 JavaScript,但根据定义它不能是超集。它限制了您可以使用 JavaScript 进行的操作,并掩盖了它的强项,同时提供了一些心理安慰。如果您真的想成为一名出色的开发人员,请不要安于表面的轻松,而应该尝试了解 JavaScript 的真正功能及其灵活性。

TypeScript 是开源的,但仅此而已

使用 TypeScript 的许多原因都归结于它是开源的。是的,TS 编译器是在 MIT 许可下分发的。但是它仍然由微软(一家垄断性公司)控制,它的开源进步不过是营销之举。不要将开源与 democracy 相混淆:Microsoft 仍然可以自由地使用 TS 做任何您想做的事情,而您就只能在一旁边观看。另一方面,JS 受国际委员会的管理,未经社区批准不会更改任何内容。

但是大公司使用它…

我不敢相信有人认为这是一个使用 TypeScript 原因。大公司还使用旧版代码库,进行税务欺诈并歧视妇女。为什么突然之间使用 TypeScript 就是一个很好的例子?

但是它具有更多功能……

不再是这样了。的确,当 TS 在 2012 年首次推出时,它具有诸如 class 之类的功能,而彼时在 JS 中仍然不可用。但是从那时起,JS 已经向前发展了很多,而 TS 也在努力跟上。如果 JS 中缺少任何内容,可以使用 babel 插件来完成。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK