新聞中心
在今年《2022 前端開(kāi)發(fā)者現(xiàn)狀報(bào)告》中顯示, 84% 受訪者表示使用過(guò) TypeScript,可見(jiàn)這門(mén)語(yǔ)言已被越來(lái)越多的前端開(kāi)發(fā)者所接受。他們表示,TypeScript 讓 Web 開(kāi)發(fā)變得輕松——不用在 IDE 和瀏覽器之間來(lái)回多次切換,來(lái)猜測(cè)為什么“undefined is not a function”。

創(chuàng)新互聯(lián)公司專(zhuān)注于神農(nóng)架林區(qū)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供神農(nóng)架林區(qū)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),神農(nóng)架林區(qū)網(wǎng)站制作、神農(nóng)架林區(qū)網(wǎng)頁(yè)設(shè)計(jì)、神農(nóng)架林區(qū)網(wǎng)站官網(wǎng)定制、小程序開(kāi)發(fā)服務(wù),打造神農(nóng)架林區(qū)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供神農(nóng)架林區(qū)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
然而,本周 redux-saga 的工程師 Eric Bower 卻在一篇博客中提出了不同意見(jiàn),他站在庫(kù)開(kāi)發(fā)者的角度,直言“我很討厭 TypeScript”,并列舉了五點(diǎn)理由。這篇博客發(fā)布后,隨即引發(fā)了贊同者和反對(duì)者的激烈討論,其中,反對(duì)者主要認(rèn)為文中的幾點(diǎn)理由只能作為開(kāi)發(fā)人員的意見(jiàn),而且并沒(méi)有提供證明實(shí)質(zhì)性問(wèn)題的具體例子。
redux-saga 是一個(gè) 庫(kù)(Library),具體來(lái)說(shuō),大部分情況下,它是以 Redux 中間件的形式而存在,主要是為了更優(yōu)雅地管理 Redux 應(yīng)用程序中的副作用(Side Effects)。
以下為 Eric 原文譯文:
作為端開(kāi)發(fā)者,其實(shí)我挺喜歡 TypeScript,它大大削減了手動(dòng)編寫(xiě)自動(dòng)化測(cè)試的需求,把勞動(dòng)力解放出來(lái)投入到更能創(chuàng)造價(jià)值的地方。總之,任何能弱化自動(dòng)化測(cè)試工作量的技術(shù),都是對(duì)生產(chǎn)力的巨大提升。
但從庫(kù)開(kāi)發(fā)的角度來(lái)看,我又很討厭 TypeScript。它煩人的地方很多,但歸根結(jié)底,TypeScript 的原罪就是降低庫(kù)開(kāi)發(fā)者的工作效率。從本質(zhì)上講,TypeScript 就是把復(fù)雜性從端開(kāi)發(fā)者那轉(zhuǎn)移給了庫(kù)開(kāi)發(fā)者,最終顯著增加了庫(kù)開(kāi)發(fā)流程側(cè)的工作負(fù)擔(dān)。
說(shuō)明文檔
端開(kāi)發(fā)者可太幸福了,TypeScript 給他們準(zhǔn)備了完備的說(shuō)明文檔和博文資料。但在庫(kù)開(kāi)發(fā)者這邊,可用的素材卻很少。我能找到的最接近庫(kù)開(kāi)發(fā)需求的內(nèi)容,主要集中在類(lèi)型操作上面。
這就讓人有種強(qiáng)烈的感覺(jué),TypeScript 團(tuán)隊(duì)覺(jué)得庫(kù)開(kāi)發(fā)者和端開(kāi)發(fā)者并沒(méi)什么區(qū)別。當(dāng)然有區(qū)別,而且很大!
為什么 TypeScript 的網(wǎng)站上沒(méi)有寫(xiě)給庫(kù)開(kāi)發(fā)者的指南?怎么就不能給庫(kù)開(kāi)發(fā)者準(zhǔn)備一份推薦工具清單?
很多朋友可能想象不到,為了在 Web 應(yīng)用和庫(kù)中找到“恰如其分”的類(lèi)型,我們得經(jīng)歷怎樣的前列。對(duì)端開(kāi)發(fā)者來(lái)說(shuō),Web 應(yīng)用開(kāi)發(fā)基本不涉及條件類(lèi)型、類(lèi)型運(yùn)算符和重載之類(lèi)的構(gòu)造。
但庫(kù)開(kāi)發(fā)者卻經(jīng)常跟這些東西打交道,因?yàn)檫@些構(gòu)造高度動(dòng)態(tài),會(huì)把邏輯嵌入到類(lèi)型當(dāng)中。這就讓 TypeScript 調(diào)度起來(lái)令人頭痛萬(wàn)分。
調(diào)試難題
庫(kù)開(kāi)發(fā)者是怎么對(duì)高度動(dòng)態(tài)、大量使用的條件類(lèi)型和重載做調(diào)試的?基本就是硬著頭皮蠻干,祈禱能順利跑通。唯一指望得上的,就是 TypeScript 編輯器和開(kāi)發(fā)者自己的知識(shí)儲(chǔ)備。換個(gè)類(lèi)型,再看看最終結(jié)果,如此循環(huán)往復(fù)。據(jù)我所知,大家似乎都是在跟著感覺(jué)走,并沒(méi)有任何穩(wěn)定可靠的科學(xué)方法。
對(duì)了,庫(kù)開(kāi)發(fā)者經(jīng)常會(huì)用到 TypeScript playground,用來(lái)隔離掉類(lèi)型邏輯中那些離散的部分,借此找出 TypeScript 解析為某種類(lèi)型的原因。Playground 還能幫助我們輕松切換 TypeScript 的版本和配置。
但這還不夠,遠(yuǎn)遠(yuǎn)不夠。我們需要更稱手的生產(chǎn)工具。
太過(guò)復(fù)雜
我跟 redux 打過(guò)不少交道,redux-toolkit 確實(shí)是個(gè)很棒的庫(kù),開(kāi)發(fā)者可以用它查看實(shí)際代碼庫(kù)中的類(lèi)型是如何正確完成的。而問(wèn)題在于,雖然它能把類(lèi)型搞得很清楚,但復(fù)雜度也同樣驚人。
- createAction #1
- createAction #2
這還只是一例,代碼庫(kù)中充斥著更多復(fù)雜的類(lèi)型。此外,大家還要考慮到類(lèi)型和實(shí)際代碼數(shù)量。純從演示出發(fā)、忽略掉導(dǎo)入的代碼,該文件中只有約 10% 的代碼(在全部 330 行中只占 35 行)能被轉(zhuǎn)譯成 JavaScript。
編碼指南經(jīng)常建議開(kāi)發(fā)者不要使用嵌套三元組。但在 TypeScript 中,嵌套三元組成了根據(jù)其他類(lèi)型縮減類(lèi)型范圍的唯一方法。是不是鬧呢……
測(cè) 試
因?yàn)榭梢詮钠渌?lèi)型生成類(lèi)型,而且各類(lèi)型都有很高的動(dòng)態(tài)特性,所以任何生產(chǎn)級(jí)別的 TypeScript 項(xiàng)目都得經(jīng)歷專(zhuān)門(mén)的一類(lèi)測(cè)試:類(lèi)型測(cè)試。而且單純對(duì)最新版本的 TypeScript 編譯器進(jìn)行類(lèi)型測(cè)試還不夠,必須針對(duì)以往的各個(gè)版本全部測(cè)試。
這種新的測(cè)試形式才剛剛起步,可用工具少得可憐,而且相當(dāng)一部分要么被放棄了、要么只保持著最基本的維護(hù)。我之前用過(guò)的庫(kù)有:
- DefinitelyTyped-tools
- sd
- dtslint (moved)
- typings-checker (deprecated)
看得出來(lái),類(lèi)型測(cè)試工具的流失率很高。而且因?yàn)殡y以遷移,我有些項(xiàng)目直到現(xiàn)在還在使用早就被棄用的庫(kù)。
當(dāng)然,其中的 dtslint 和 tsd 算是相對(duì)靠譜,但它們互為補(bǔ)充、而非擇一即可。為什么我們需要兩款工具才能完成同一類(lèi)工作?這個(gè)問(wèn)題很難回答,實(shí)際使用體驗(yàn)也是相當(dāng)難受。
維 護(hù)
類(lèi)型會(huì)給庫(kù)添加大量代碼。在初次為某個(gè)項(xiàng)目做貢獻(xiàn)時(shí),首先需要了解應(yīng)用程序邏輯和類(lèi)型邏輯,這直接就讓很多打算參與的朋友望而卻步了。我就幫忙維護(hù)過(guò) redux-saga,項(xiàng)目近期發(fā)布的 PR 和 issue 主要就集中在類(lèi)型身上。
我發(fā)現(xiàn)相較于編寫(xiě)庫(kù)代碼,我花在類(lèi)型調(diào)整上的時(shí)間要多得多。
我精通 TypeScript,但還沒(méi)到專(zhuān)家那個(gè)水平。在經(jīng)歷了幾年的 TypeScript 編程之后,作為一名庫(kù)開(kāi)發(fā)者,我還是覺(jué)得自己用不明白 TypeScript。所以,精通好像成了 TypeScript 的準(zhǔn)入門(mén)檻。這里的萬(wàn)惡之源就是類(lèi)型,它讓 js 庫(kù)維護(hù)變得困難重重,斷絕了后續(xù)開(kāi)發(fā)者的貢獻(xiàn)參與通道。
總 結(jié)
我認(rèn)可 TypeScript 的成績(jī),也欽佩它背后的開(kāi)發(fā)團(tuán)隊(duì)。TypeScript 的出現(xiàn)徹底改變了前端開(kāi)發(fā)的格局,任何人都不能忽視這份貢獻(xiàn)。
但作為庫(kù)開(kāi)發(fā)者,我們需要:
- 更好的說(shuō)明文檔。
- 更好的工具。
- 更易用的 tsc。
不管怎么說(shuō),靠研究 TypeScript 編譯器源代碼才能搞清楚一段代碼為什么會(huì)被解析成特定類(lèi)型,也實(shí)在是太離譜了。
當(dāng)前題目:TypeScript遭庫(kù)開(kāi)發(fā)者嫌棄:類(lèi)型簡(jiǎn)直是萬(wàn)惡之源
分享路徑:http://m.fisionsoft.com.cn/article/coechcj.html


咨詢
建站咨詢
