“再见了,TypeScript!”,Ruby on Rails 之父 DHH 也因“类型”遭劝退

a9479a5e2325a636b1b839a9b2c8106c.gif

整理 | 屠敏

出品 | CSDN(ID:CSDNnews)

作为 JavaScript 的一个超集,TypeScript 在微软内部沉淀两年后,带着弥补 JavaScript 在开发大型应用中遇到的种种问题的使命,于 2012 年 10 月正式面世。

然而,近几年来,曾经如日中天的 TypeScript,接连受挫,遭到各个社区与应用的摒弃。前有 Svelte 创建者 Rich Harris 选择从 TypeScript 转向 JavaScript 和 JSDoc,今有 Ruby on Rails 的创建 DHH 在多平台发布声明,宣布「再见了,TypeScript!

f896fb7573e335ce40a71fd97c83a988.png

这也让众人深感好奇,TypeScript 怎么就成为了开发者眼中“不值得”的技术之一?

6eddc0fabb71383d394d737f3d1e1e43.png

DHH 发布声明:Turbo 8 正在放弃 TypeScript!

首先,简单介绍一下,DHH 是谁。

在开发圈,也许不少人对 DAVID HEINEMEIER HANSSON(简称 DHH)并不陌生。他被人们视为软件天才,以开发了开源项目 Ruby on Rails 而被众人熟知,Hulu、GitHub、早期的 Twitter 都使用了这种框架。同时,DHH 也带来了一款软件即服务的产品 Basecamp,担任 37signals 的 CTO,是一位长期活跃的社交媒体用户和畅销书籍的作者。

他官宣弃用 TypeScript 后,这一决定首先会应用在 JavaScript 库 Turbo 8 身上。

Turbo,是一种用于传递 HTML 页面的框架,指集成了几种技术以创建快速的、现代的、渐进式增强的 Web 应用而不需要使用太多的 JavaScript。借助 Turbo,你让服务端直接发布 HTML。

对此,DHH 表示,“从各方面来看,TypeScript 对微软来说都是一个巨大的成功。我看到很多人因为 JavaScript 中加入了可由编译器检查的显式类型而欢欣鼓舞。但我从来都不是它的粉丝。五分钟后不会喜欢,五年之后也不会喜欢。因此,我非常高兴地宣布,我们将在 Turbo 8 的下一个大版本中删除 TypeScript。”

c5d0937780093bd86be8da4e80076035.png

TypeScript 替代不了 JavaScript

相较之下,DHH 坦言,他其实更喜欢 JavaScript。

「我甚至可以说它是继 Ruby 之后我第二喜欢的语言。不过,更早之前并非如此,但自从 JavaScript 中有了适当的类,以及 ES6 之后的所有其他改进之后,编写 JavaScript 就成了一种真正的乐趣」,DHH 写道。

JavaScript 虽然不适合在网络应用程序的服务器端所做的大部分工作,但现在拥有如此强大的 JavaScript,浏览器无需编译器就能解释它,这是让 DHH 感到非常幸运的地方。

现如今之所以放弃 TypeScript,和过往很多人一样,DHH 透露主要是因为 TypeScript 的「类型」。他的博客中写道:

对我来说,TypeScript 就是个障碍。不仅因为它需要一个显式的编译步骤,还因为它用类型污染了代码,给我的开发体验带来的快乐少之又少,而且经常会带来相当大的痛苦。本应简单的事情变得困难,而困难的事情变得"无处不在"。

不过,这并不是要让任何人改变什么。正如我在《编程类型与思维方式》一文中所讨论的,通常很少有程序员有兴趣改变他们对类型的看法。大多数程序员都会在职业生涯的早期就发现自己强烈地倾向于或不倾向于 TypeScript,然后在余下的时间里向自己和他人解释 "正确的选择"。

这就是 JavaScript 与 TypeScript 二分法的魅力所在,TypeScript 的支持者意识到完全替代 JavaScript 是不可能的,所以从一开始就必须实现完全兼容,这一点值得称赞。Turbo 8 弃用 TypeScript 并不意味着你不能用它编写客户端代码,或使用任何其他采用它的库。我们可以混搭使用,这很好。

这也是必要的。因为 JavaScript 与 Ruby 等语言不同,后者是服务器端的首选语言,而 JavaScript 则是客户端的必需语言。虽然你可以将方言编译到 JavaScript 中,但你仍然必须接受这样一个事实:在浏览器中运行代码就意味着运行 JavaScript。因此,在这种情况下,能够不使用任何工具、不使用任何强类型来编写 JavaScript 是一件幸事。

所以,再见了,TypeScript。愿你为你的部落带来更多严谨和满足,同时让我们其他人享受 JavaScript 最初设计时的光荣精神:没有强类型。

18be1afc0702e47e6adab424d8ba95aa.png

因为”类型“,越来越多的人加入了放弃 TypeScript 的队伍

事实上,DHH 并非是第一个宣布不想再用 TypeScript 的开发者。

早在 2020 年,Deno 宣布弃用 TypeScript,还给出了五个理由:

  • 当更改文件时,TypeScript 的编译需要几分钟,这使得项目文件的连续编译非常缓慢。

  • 在创建实际的 Deno 可执行文件和面向用户的 API 文件时,使用的 TypeScript 结构会造成项目运行的性能问题。

  • 事实证明,TypeScript 本身对 Deno 代码管理没有帮助,并且 Deno 团队正经受着相反的效果。在项目的议题列表中就提到一个问题:在两个不同的位置产生了相同的独立主体类。

  • 必须手动保持内部代码和运行时 TypeScript 声明的同步,因为 TypeScript 编译器对生成 d.ts 文件没有帮助。

  • Deno 团队需要去维护两台 TS 编译器主机:一个用于内部代码,另一个用于外部用户代码,尽管两者的目标相似。

除此之外,也正如文章伊始所提及的,Svelte 创建者 Rich Harris 认为 TypeScript 对开发库来说“不值得”,所以让团队选择从 TypeScript 转向 JavaScript 和 JSDoc。

在他看来,“类型确实很棒,但 TypeScript 有点麻烦……一旦用上了.ts 文件,就必须同时使用支持它的工具……所以我逐渐觉得,使用 TypeScript 这样的非标语言并不值得。于是,我们开始将所有类型都放入 JSDoc 注释,这样既保证了类型安全,又回避了缺点。毕竟这只是 JavaScript,所有内容都在注释当中,只要运行代码就行。我们在 Sveltekit 代码中就是这么做的,效果非常好。所以对于 Svelte 4.0,我们也将采取同样的思路、借此加快开发速度。”

不久之前,redux-saga 的工程师 Eric Bower 发布了一篇《Typescript 对于库开发人员来说很糟糕》的文章,其中他从 TypeScript 的说明文档、调试、复杂性、测试等多个维度分享了对 TypeScript 的不满。

Eric Bower 表示,”类型会给库添加大量代码......我发现相较于编写库代码,我花在类型调整上的时间要多得多。我精通 TypeScript,但我不是专家。令人沮丧的是,在花了多年时间编写 TypeScript 代码之后,我仍然不具备作为库开发人员使用 TypeScript 所需的知识。精通似乎是一个上手 TypeScript 的门槛。这里的万恶之源就是类型,它让 js 库维护变得困难重重,断绝了后续开发者的贡献参与通道。“

不过,并非所有开发者都对 TypeScript 的类型避而不见,在 HN 上,也有很多程序员展开了激烈的讨论。

3ee4dfa5e8d0c54fa886fd5f4b09aabe.png

其中,一位名为 waterluvian 的用户表示:

多年来,我一直对 "会拖慢我速度的额外复杂层 "有抵触情绪,后来我采用了 TS,现在我已经离不开它了。

因此,作为一个粉丝,当我读到这样的事情时,我会尽力去换位思考,试着从他们的角度去理解。但在这种情况下,我真的很难做到。

我知道它增加了一些复杂性。但如果没有它,你又能得到什么呢?这并不是说类型会消失。它们不会消失。它们只是变得隐蔽了。它把计算机擅长的东西塞进了你的大脑。正如很多人指出的:类型更多的是一种文档。

但除了这些(我觉得这是最重要的一课):当支持率达到 100:1,你可能就错了。但有时你最多只能说:"我根本不了解你们这些人,但你们是绝大多数,所以不管我喜不喜欢,我都必须保持现状"。

对于 DHH 此次弃用 TypeScript,在 GitHub pull request 板块,也有用户评论道:“我不确定删除 TypeScript 是否是最好的方法。对我来说,TypeScript 对我的贡献确实很大,而且我觉得在库级代码中使用它仍然很有意义。你从中获得的 DX 真的很有价值,实际上有助于捕捉 bug。但我也明白,在某些情况下,它很快就会变得很烦人。但完全删除类型(即使没有 JSDocs 和/或 .d.ts 文件)对于库用户和贡献者来说都是一种退步。

2323d65efde22722c041a06169826db0.png

对此,你是否使用过 TypeScript,你如何看待它的类型?

参考:

https://world.hey.com/dhh/turbo-8-is-dropping-typescript-70165c01

https://devclass.com/2023/05/11/typescript-is-not-worth-it-for-developing-libraries-says-svelte-author-as-team-switches-to-javascript-and-jsdoc/

推荐阅读:

小红书爱招聘技术⼈超过BAT、互联网人月薪不足4万、人才热投易主……2023泛互联网行业人才流动报告出炉!

Python 连续八年夺冠、SQL 就业最热门,IEEE Spectrum 发布 2023 年度编程语言榜单!

马斯克的至暗时刻:童年被父亲大骂白痴、特斯拉濒临破产和SpaceX火箭爆炸带来双重崩溃

TypeScript 是一种由微软开发的开源编程语言,它建立在 JavaScript 的基础上,并添加了静态类型检查、类、接口以及更多的高级特性。以下是 TypeScript 的几个关键特点: ### 静态类型系统 相比于纯 JavaScript 中隐式的类型推断,TypeScript 强制开发者明确指定变量、函数参数和返回值的类型,这有助于提前发现潜在的类型错误,提高代码质量和维护性。 ### 类和继承 TypeScript 支持传统面向对象编程的核心概念,包括类、构造函数、继承、封装和多态。你可以定义类并创建实例,通过继承机制复用代码,实现方法和属性的共享。 ### 接口 接口用于描述对象的结构,规定了对象应该包含哪些属性和方法。虽然 JavaScript 使用原型链来实现属性和方法的访问,但在 TypeScript 中,接口可以更清晰地表示数据结构的预期形态。 ### 动态类型与可选参数 尽管 TypeScript 是静态类型的,但它允许你在运行时动态判断类型,比如使用 `instanceof` 检查对象是否属于某个类型。同时,可选参数允许你在调用函数时省略某些位置参数。 ### 流程控制和循环 TypeScript 支持所有标准的流程控制结构(如 if、else、switch),并且还支持增强 for 循环等现代 JavaScript 特性,使得处理数组和集合变得更加便捷高效。 ### 编译到 JavaScript TypeScript 的核心目的是为了提供更好的开发体验给 JavaScript 开发者。当你编写完 TypeScript 代码后,可以使用 TypeScript 编译器将其转换为纯 JavaScript 文件。这个过程能够保留原有的代码逻辑,同时也包含了类型信息,对于需要优化性能的应用场景尤为重要。 ### 生产力工具和社区生态 得益于其广泛的社区支持和集成的 IDE 和编辑器插件(如 Visual Studio Code、IntelliJ IDEA 等),TypeScript 提供了强大的代码智能提示、自动完成和错误检测功能,大大提高了开发效率。 ### 应用范围广泛 TypeScript 可以应用于各种规模和复杂度的项目,从小型脚本到大型企业级应用,甚至前端单页面应用(SPA)、服务器端渲染、桌面应用程序开发等领域都能见到 TypeScript 的身影。 --- ### 相关问题: 1. TypeScriptJavaScript 有何区别? 2. 如何开始学习和使用 TypeScript? 3. TypeScript 是否支持最新的 ES6+ JavaScript 标准特征?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值