这就是我讨厌 Typescript 的原因 你不应该使用 Typescript

2025-06-07

这就是我讨厌 Typescript 的原因

你不应该使用 Typescript

这是一篇讽刺文章,探讨了一些你实际上可以找到的反对 Typescript 的论点。虽然其中大部分都被夸大了,但它们都代表了一个人或几个人的观点。

Typescript 不是标准

TypeScript 只不过是一堆垃圾,堆砌在有史以来最优秀的语言 JavaScript 之上,它甚至没有尝试遵循 JS 的标准。我会给你举几个例子,说明 TypeScript 是如何不遵循 ES 标准的。

模块

TS 有自己的模块系统,称为命名空间。你可能会问,什么是命名空间?它是微软发明的,完全忽略了 ES6 标准模块。即使 TS 首次发布时 ES6 模块还没有定义,微软也应该知道!另外,我不在乎 TS 现在是否支持 ES 模块,命名空间本来就不应该存在,应该消失!

课程

就像 TS 有命名空间一样,它们有自己的方式来声明类。

Typescript 中的一个类:

class Foo {
  bar = 0;
  baz = 0;
}
Enter fullscreen mode Exit fullscreen mode

Javascript 中的一个类:

function Foo() {
  this.bar = 0;
  this.baz = 0;
}
Enter fullscreen mode Exit fullscreen mode

您可能会争辩说我正在编写 ES5 风格的类,但即使使用 ES2015,JS 看起来也要好得多!

class Foo {
  constructor() {
    this.bar = 0;
    this.baz = 0;
  }
}
Enter fullscreen mode Exit fullscreen mode

你也可以说,当 TS 引入类时,JS 的类提案还没有定义,没错。但为什么他们要使用类字段声明呢?它们还不是标准!(至少目前还不是)

私有属性

嗯,JS 没有私有成员,但是当它有的时候,它会是这样的:

class Foo {
  constructor() {
    this.#bar = 0;
  }
}
Enter fullscreen mode Exit fullscreen mode

现在,TS 确实支持私有成员,但是在 Microsoft 语言中它看起来如何?

class Foo {
  private bar = 0;
}
Enter fullscreen mode Exit fullscreen mode

丑!他们甚至都没动手!不是吗?这还不够,TS 里的“私有”成员其实也不是真正的私有成员,因为你可以通过括号语法访问它们!

Typescript 不是 JavaScript

尝试用一个全新的 TS 项目编译任何现有的 ES 代码。你肯定做不到。因为 Typescript 不是 JavaScript!甚至连一个简单的阶乘函数都不是。

在 JS 中:

function factorial (n) { 
  if (n == 0) return 1;

  return n * factorial (n-1); 
}
Enter fullscreen mode Exit fullscreen mode

在 TS 中:

function factorial (n) { 
  if (n == 0) return 1;

  return n * factorial (n-1); 
}
Enter fullscreen mode Exit fullscreen mode

现在有两个错误,因为 TS 无法理解你在做什么。你必须用 TypeScript 能理解的语法来写。

function factorial (n: number): number { 
  if (n == 0) return 1;

  return n * factorial (n-1); 
}
Enter fullscreen mode Exit fullscreen mode

TS,就是这样!现在你,以及世界上任何其他人,只要读一下签名,就能知道这个函数应该返回什么,以及参数类型应该是什么。我不想写那样的代码。为什么 TS 无法理解我返回的是一个最终会返回数字的函数呢?再说,如果我想让别人理解我的代码,我会给它加注释,或者添加单元测试。这正是为了让任何人都能理解代码所需要的。再说,这是一个基本函数,还需要解释什么呢?你不可能无知到连函数式递归纯函数都不知道!

你可能会说,我必须更改编译器选项,并禁用“隐式 any”才能消除此错误。但我希望 TS 能够更好地理解我的代码。

Typescript 的创建者对编程一无所知

首先我要说的是,微软是万恶之父,而 Typescript 正是微软创造的。正如我上面解释的那样,它不遵循任何标准,其诞生的唯一目的就是消灭我们熟知的 Web 开发。永远记住微软的座右铭:拥抱、扩展、消灭。这已经是近 20 年前的事了,但别搞错了,公司是不会变的!微软还是那家想要控制一切的老公司!

其次,如果你查一下 Typescript 的主要开发者之一,以及很可能多年来一直致力于塑造 Typescript 的人,你会发现Anders Hejlsberg。他对编程了解多少?他是个对标准一无所知的老头子。他只开发过Turbo PascalDelphi这样的程序。而他对语言的唯一了解,是因为他是 C# 的首席架构师。我相信社区里的任何人都能做得更好。

人们只使用 Typescript,因为他们习惯于 OO 语言

那些更喜欢使用 Typescript 而不是 JavaScript 的开发者,只是对 JavaScript 是函数式编程感到失望,他们宁愿忽略 JavaScript 的所有优秀特性,用传统的面向对象方式编写代码,而成为前端开发者,就等于挡了他们的路。兄弟,你必须打破这些枷锁!你需要理解 JS 赋予你的自由,并拥抱它!而你只有以传统的方式使用 JavaScript 才能做到这一点。

好吧。这部分我会很认真,因为大部分情况确实如此。我认识的大多数开发者,比如 C# 或 Java 等面向对象语言出身,都会尝试按照他们习惯的方式使用 TS。这才是真正的问题所在。TS 并非 JS 上的魔法糖。你真的需要理解 JS,才能理解 TS 究竟能帮你做什么。如果你不理解,你最终可能会写出更多不该写的代码,使用反模式,并制造更多本不该犯的错误。

你无法调试 Typescript

你用过 Webpack、Parcel 或其他能生成源码映射的构建工具吗?为什么?因为你得停下来,直接写普通的 JavaScript 代码。因为如果你编译过,你可能需要用其他工具来调试代码。最好写一些只能用 IE 开发者工具调试的代码。

Babel 好太多了

我已经说过 Typescript 不是 JavaScript。但 Babel 是。它是标准的 JS,可以编译成标准的 JavaScript。比较一下:Typescript vs Babel

Typescript 仅用于 Angular

这就是我也不喜欢 Angular 的原因。我还没见过哪个项目用 TS。再说一遍,我还没见过哪个 项目 Typescript 喜欢Typescript

流动性更好

因为,既然你可以在文件中直接写类型,为什么还要再加一个文件扩展名来明确声明你不是在写 JS 代码呢?而且,随着越来越多的项目使用 Flow 进行编写,.jsFlow 的支持也越来越好。

你不应该使用 Typescript

如果……你感觉不舒服。如果你没注意到,这是一篇讽刺文章,针对的是那些抱怨 TS 的人。我并不是说你应该到处都用 TS,我相信如果你想做一个待办事项应用,用 JS 做也是安全的。但根据我的经验,如果你和 3 个人以上一起工作,TS 的利大于弊。而且我不得不说,如果你不懂 JS,使用 TS 会很麻烦。但我认为这不是 Typescript 团队的问题,而是我们的问题。

作为开发者,我们需要明白每种语言都是一种工具,能够帮助我们完成某些事情。有时你需要一把锤子,有时你需要一把星号键。并非所有语言都适合所有情况,也许习惯了星号键的人会不喜欢用锤子。但我们不能简单地说每个用锤子的人都是错的,或者他们应该用星号键。

你不妨学习如何使用锤子。

文章来源:https://dev.to/michaeljota/this-is-why-i-hate-typescript-3da0
PREV
Cloud Run 上的 Deno
NEXT
想要工作经验?我们正在寻找开发人员