出品 | CSDN(ID:CSDNnews)
作為 Javascript 的一個(gè)超集,Typescript 在微軟內(nèi)部沉淀兩年后,帶著彌補(bǔ) Javascript 在開(kāi)發(fā)大型應(yīng)用中遇到的種種問(wèn)題的使命,于 2012 年 10 月正式面世。然而,近幾年來(lái),曾經(jīng)如日中天的 Typescript,接連受挫,遭到各個(gè)社區(qū)與應(yīng)用的摒棄。前有 Svelte 創(chuàng)建者 Rich Harris 選擇從 Typescript 轉(zhuǎn)向 Javascript 和 JSDoc,今有 Ruby on Rails 的創(chuàng)建 DHH 在多平臺(tái)發(fā)布聲明,宣布「再見(jiàn)了,Typescript!」這也讓眾人深感好奇,Typescript 怎么就成為了開(kāi)發(fā)者眼中“不值得”的技術(shù)之一?DHH 發(fā)布聲明:Turbo 8 正在放棄 Typescript!首先,簡(jiǎn)單介紹一下,DHH 是誰(shuí)。在開(kāi)發(fā)圈,也許不少人對(duì) DAVID HEINEMEIER HANSSON(簡(jiǎn)稱(chēng) DHH)并不陌生。他被人們視為軟件天才,以開(kāi)發(fā)了開(kāi)源項(xiàng)目 Ruby on Rails 而被眾人熟知,Hulu、GitHub、早期的 Twitter 都使用了這種框架。同時(shí),DHH 也帶來(lái)了一款軟件即服務(wù)的產(chǎn)品 Basecamp,擔(dān)任 37signals 的 CTO,是一位長(zhǎng)期活躍的社交媒體用戶(hù)和暢銷(xiāo)書(shū)籍的作者。他官宣棄用 Typescript 后,這一決定首先會(huì)應(yīng)用在 Javascript 庫(kù) Turbo 8 身上。Turbo,是一種用于傳遞 HTML 頁(yè)面的框架,指集成了幾種技術(shù)以創(chuàng)建快速的、現(xiàn)代的、漸進(jìn)式增強(qiáng)的 Web 應(yīng)用而不需要使用太多的 Javascript。借助 Turbo,你讓服務(wù)端直接發(fā)布 HTML。對(duì)此,DHH 表示,“從各方面來(lái)看,Typescript 對(duì)微軟來(lái)說(shuō)都是一個(gè)巨大的成功。我看到很多人因?yàn)?Javascript 中加入了可由編譯器檢查的顯式類(lèi)型而歡欣鼓舞。但我從來(lái)都不是它的粉絲。五分鐘后不會(huì)喜歡,五年之后也不會(huì)喜歡。因此,我非常高興地宣布,我們將在 Turbo 8 的下一個(gè)大版本中刪除 Typescript。”Typescript 替代不了 Javascript相較之下,DHH 坦言,他其實(shí)更喜歡 Javascript。「我甚至可以說(shuō)它是繼 Ruby 之后我第二喜歡的語(yǔ)言。不過(guò),更早之前并非如此,但自從 Javascript 中有了適當(dāng)?shù)念?lèi),以及 ES6 之后的所有其他改進(jìn)之后,編寫(xiě) Javascript 就成了一種真正的樂(lè)趣」,DHH 寫(xiě)道。Javascript 雖然不適合在網(wǎng)絡(luò)應(yīng)用程序的服務(wù)器端所做的大部分工作,但現(xiàn)在擁有如此強(qiáng)大的 Javascript,瀏覽器無(wú)需編譯器就能解釋它,這是讓 DHH 感到非常幸運(yùn)的地方。現(xiàn)如今之所以放棄 Typescript,和過(guò)往很多人一樣,DHH 透露主要是因?yàn)?Typescript 的「類(lèi)型」。他的博客中寫(xiě)道:對(duì)我來(lái)說(shuō),Typescript 就是個(gè)障礙。不僅因?yàn)樗枰粋€(gè)顯式的編譯步驟,還因?yàn)樗妙?lèi)型污染了代碼,給我的開(kāi)發(fā)體驗(yàn)帶來(lái)的快樂(lè)少之又少,而且經(jīng)常會(huì)帶來(lái)相當(dāng)大的痛苦。本應(yīng)簡(jiǎn)單的事情變得困難,而困難的事情變得"無(wú)處不在"。不過(guò),這并不是要讓任何人改變什么。正如我在《編程類(lèi)型與思維方式》一文中所討論的,通常很少有程序員有興趣改變他們對(duì)類(lèi)型的看法。大多數(shù)程序員都會(huì)在職業(yè)生涯的早期就發(fā)現(xiàn)自己強(qiáng)烈地傾向于或不傾向于 Typescript,然后在余下的時(shí)間里向自己和他人解釋 "正確的選擇"。這就是 Javascript 與 Typescript 二分法的魅力所在,Typescript 的支持者意識(shí)到完全替代 Javascript 是不可能的,所以從一開(kāi)始就必須實(shí)現(xiàn)完全兼容,這一點(diǎn)值得稱(chēng)贊。Turbo 8 棄用 Typescript 并不意味著你不能用它編寫(xiě)客戶(hù)端代碼,或使用任何其他采用它的庫(kù)。我們可以混搭使用,這很好。這也是必要的。因?yàn)?Javascript 與 Ruby 等語(yǔ)言不同,后者是服務(wù)器端的首選語(yǔ)言,而 Javascript 則是客戶(hù)端的必需語(yǔ)言。雖然你可以將方言編譯到 Javascript 中,但你仍然必須接受這樣一個(gè)事實(shí):在瀏覽器中運(yùn)行代碼就意味著運(yùn)行 Javascript。因此,在這種情況下,能夠不使用任何工具、不使用任何強(qiáng)類(lèi)型來(lái)編寫(xiě) Javascript 是一件幸事。所以,再見(jiàn)了,Typescript。愿你為你的部落帶來(lái)更多嚴(yán)謹(jǐn)和滿(mǎn)足,同時(shí)讓我們其他人享受 Javascript 最初設(shè)計(jì)時(shí)的光榮精神:沒(méi)有強(qiáng)類(lèi)型。因?yàn)椤鳖?lèi)型“,越來(lái)越多的人加入了放棄 Typescript 的隊(duì)伍事實(shí)上,DHH 并非是第一個(gè)宣布不想再用 Typescript 的開(kāi)發(fā)者。早在 2020 年,Deno 宣布棄用 Typescript,還給出了五個(gè)理由:
- 當(dāng)更改文件時(shí),Typescript 的編譯需要幾分鐘,這使得項(xiàng)目文件的連續(xù)編譯非常緩慢。
- 在創(chuàng)建實(shí)際的 Deno 可執(zhí)行文件和面向用戶(hù)的 API 文件時(shí),使用的 Typescript 結(jié)構(gòu)會(huì)造成項(xiàng)目運(yùn)行的性能問(wèn)題。
- 事實(shí)證明,Typescript 本身對(duì) Deno 代碼管理沒(méi)有幫助,并且 Deno 團(tuán)隊(duì)正經(jīng)受著相反的效果。在項(xiàng)目的議題列表中就提到一個(gè)問(wèn)題:在兩個(gè)不同的位置產(chǎn)生了相同的獨(dú)立主體類(lèi)。
- 必須手動(dòng)保持內(nèi)部代碼和運(yùn)行時(shí) Typescript 聲明的同步,因?yàn)?Typescript 編譯器對(duì)生成 d.ts 文件沒(méi)有幫助。
- Deno 團(tuán)隊(duì)需要去維護(hù)兩臺(tái) TS 編譯器主機(jī):一個(gè)用于內(nèi)部代碼,另一個(gè)用于外部用戶(hù)代碼,盡管兩者的目標(biāo)相似。
除此之外,也正如文章伊始所提及的,Svelte 創(chuàng)建者 Rich Harris 認(rèn)為 Typescript 對(duì)開(kāi)發(fā)庫(kù)來(lái)說(shuō)“不值得”,所以讓團(tuán)隊(duì)選擇從 Typescript 轉(zhuǎn)向 Javascript 和 JSDoc。在他看來(lái),“類(lèi)型確實(shí)很棒,但 Typescript 有點(diǎn)麻煩……一旦用上了.ts 文件,就必須同時(shí)使用支持它的工具……所以我逐漸覺(jué)得,使用 Typescript 這樣的非標(biāo)語(yǔ)言并不值得。于是,我們開(kāi)始將所有類(lèi)型都放入 JSDoc 注釋?zhuān)@樣既保證了類(lèi)型安全,又回避了缺點(diǎn)。畢竟這只是 Javascript,所有內(nèi)容都在注釋當(dāng)中,只要運(yùn)行代碼就行。我們?cè)?Sveltekit 代碼中就是這么做的,效果非常好。所以對(duì)于 Svelte 4.0,我們也將采取同樣的思路、借此加快開(kāi)發(fā)速度。”不久之前,redux-saga 的工程師 Eric Bower 發(fā)布了一篇《Typescript 對(duì)于庫(kù)開(kāi)發(fā)人員來(lái)說(shuō)很糟糕》的文章,其中他從 Typescript 的說(shuō)明文檔、調(diào)試、復(fù)雜性、測(cè)試等多個(gè)維度分享了對(duì) Typescript 的不滿(mǎn)。Eric Bower 表示,”類(lèi)型會(huì)給庫(kù)添加大量代碼......我發(fā)現(xiàn)相較于編寫(xiě)庫(kù)代碼,我花在類(lèi)型調(diào)整上的時(shí)間要多得多。我精通 Typescript,但我不是專(zhuān)家。令人沮喪的是,在花了多年時(shí)間編寫(xiě) Typescript 代碼之后,我仍然不具備作為庫(kù)開(kāi)發(fā)人員使用 Typescript 所需的知識(shí)。精通似乎是一個(gè)上手 Typescript 的門(mén)檻。這里的萬(wàn)惡之源就是類(lèi)型,它讓 js 庫(kù)維護(hù)變得困難重重,斷絕了后續(xù)開(kāi)發(fā)者的貢獻(xiàn)參與通道。“不過(guò),并非所有開(kāi)發(fā)者都對(duì) Typescript 的類(lèi)型避而不見(jiàn),在 HN 上,也有很多程序員展開(kāi)了激烈的討論。其中,一位名為 waterluvian 的用戶(hù)表示:多年來(lái),我一直對(duì) "會(huì)拖慢我速度的額外復(fù)雜層 "有抵觸情緒,后來(lái)我采用了 TS,現(xiàn)在我已經(jīng)離不開(kāi)它了。因此,作為一個(gè)粉絲,當(dāng)我讀到這樣的事情時(shí),我會(huì)盡力去換位思考,試著從他們的角度去理解。但在這種情況下,我真的很難做到。我知道它增加了一些復(fù)雜性。但如果沒(méi)有它,你又能得到什么呢?這并不是說(shuō)類(lèi)型會(huì)消失。它們不會(huì)消失。它們只是變得隱蔽了。它把計(jì)算機(jī)擅長(zhǎng)的東西塞進(jìn)了你的大腦。正如很多人指出的:類(lèi)型更多的是一種文檔。但除了這些(我覺(jué)得這是最重要的一課):當(dāng)支持率達(dá)到 100:1,你可能就錯(cuò)了。但有時(shí)你最多只能說(shuō):"我根本不了解你們這些人,但你們是絕大多數(shù),所以不管我喜不喜歡,我都必須保持現(xiàn)狀"。對(duì)于 DHH 此次棄用 Typescript,在 GitHub pull request 板塊,也有用戶(hù)評(píng)論道:“我不確定刪除 Typescript 是否是最好的方法。對(duì)我來(lái)說(shuō),Typescript 對(duì)我的貢獻(xiàn)確實(shí)很大,而且我覺(jué)得在庫(kù)級(jí)代碼中使用它仍然很有意義。你從中獲得的 DX 真的很有價(jià)值,實(shí)際上有助于捕捉 bug。但我也明白,在某些情況下,它很快就會(huì)變得很煩人。但完全刪除類(lèi)型(即使沒(méi)有 JSDocs 和/或 .d.ts 文件)對(duì)于庫(kù)用戶(hù)和貢獻(xiàn)者來(lái)說(shuō)都是一種退步。”
參考:
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/
該文章在 2023/9/13 15:15:43 編輯過(guò)