為什么要使用typescript
- 前段時間,被問到一個問題就是為什么要使用typescript或者說ts的優(yōu)劣在哪里,我腦海里能立馬能浮現出來的幾個關鍵詞:類型檢查、代碼質量等等,但并沒有深刻的思考,為什么要用?之前的項目能不用嗎,好像也可以。
- 現在準備深入的思考一下typescript,希望自己不是為了"跟風"去使用typescript,而是真正的讓ts給自己帶來了便利解決了痛點,而去使用typescript
typescript的優(yōu)勢
-
類型檢查: Typescript作為js的超集,首先提供的一個比較重要的特性就是類型檢查,把無類型的語言升級成了類型語言。
- 定義好類型聲明后:配合IDE開發(fā)工具(比如我使用的vscode),我們可以在寫代碼的過程中,就根據類型檢查+編輯器的錯誤提示識別出一些代碼錯誤。并且在寫的過程中,開發(fā)工具能提供語法提示,比如引入一個第三方包或者一個對象屬性時,再輸入前面幾個字母后,開發(fā)工具就能自動幫你補全。這是一種語言工具和開發(fā)工具相結合,提高開發(fā)效率和debug效率的良好實踐,也是使用ts開發(fā)時體驗良好的原因之一。
- 類型聲明代碼同時也能看成一種api文檔或注釋,比如你引入了一個第三方的模塊包,你可以點開它的typescript類型聲明代碼,就能清楚的看到他有提供哪些接口,分別接受什么參數,如果再搭上一些注釋,明顯地可以讓使用者感覺更加清楚。
- 當然類型檢查的強大遠不止我上面講的這一點,具體的優(yōu)勢開發(fā)者可以自行去體會。
-
超集之外的語法糖:Typescript作為JavaScript的超集,意味著他能提供原生js之外的語法。
- 舉個例子:TypeScript中有一個optional chain的語法,就比如有個js對象
obj,取它的一個屬性a,用js來寫就是:obj.a,但如果obj是null或者undefined的話代碼就會報錯,而如果用ts,就可以這樣:obj?.a,他可以兼容上面說的會報錯的情況。 - 譬如上面提到的這種新的語法糖,確實能夠在我們編碼的過程中給我們提供一些便利,可以少寫一些容錯代碼(當然,本質上還是會轉成js代碼,只不過這些容錯代碼是ts幫你加上了),提高了編程效率。
- 舉個例子:TypeScript中有一個optional chain的語法,就比如有個js對象
- 多人協(xié)作/項目重構:這個優(yōu)勢是根據具體項目來說的,仔細想想簡單一點的項目似乎確實不用上ts。如果一個項目是多人協(xié)作跨團隊協(xié)作,涉及到的一個問題就是你得去看或者修改別人寫的代碼,特別是重構別人的原有代碼時,這是一個特別容易出bug的步驟。如果使用了Typescript,在修改代碼時,ts會幫你做一層校驗,避免一些低級的錯誤,提前暴露問題。而且我個人的感覺:在看別人的代碼時,Typescript代碼比原生的JavaScript看起來更便捷更容易。
Typescript的劣勢
- 首先作為一門語言或者說工具而言,我認為Typescript并沒有特別明顯或不可容忍的缺點。下面說的這些劣勢,都是在結合實際項目,開展開發(fā)工作時會出現的,同時也是可以人為的克服或避免的。
-
成本。使用Typescript肯定是比直接使用JavaScript要多一些成本的。
- 學習成本。這一點沒什么好說的了,不會Typescript的同學,團隊要上ts,肯定要大家花時間去學習的。
-
遷移成本。原有的js寫的項目,要遷移到ts,肯定有成本對吧。比如你要從webpack的配置就得開始改起來,啟動服務和打包的過程中多一層ts編譯,eslint中添加對Typescript的校驗規(guī)則等等。這些還只是從工程化的過程中就要改動的,js代碼也得改對吧。所以從原js代碼中遷移到ts,其實是工作量不算小的,尤
其是你要做到類型聲明完備的話。所以最好在新項目啟動的時候,就考慮考慮是否要使用Typescript,要的話就在立項目的時候就上ts了。
- 框架社區(qū)生態(tài)。你所使用的前端框架,也決定了你使用ts方不方便,angular是必須要用ts寫的,當然兼容性是最好的;react自己實現了tsx,兼容ts也挺不錯的;但是vue(2.0版本)其實對ts的兼容并不算好,好在3.0版本開始全面兼容ts了。其次,比如你項目使用的ts,然后另外引入了一個第三方模塊,這個模塊對ts沒有支持,那么這個時候還需要額外的工作去兼容這個模塊,起碼你得寫一個這個模塊的類型聲明文件對吧。
-
編碼習慣。Typescript給我們提供了很多強大的功能,但是實際編寫代碼的過程中,不同水平的開發(fā)人員可能寫出來的代碼大相徑庭。比如能用可選鏈的情況不用,該抽泛型的函數不抽等等。
- 但我覺得最重要的一點就是:any。any就是表示任何類型,一個變量可以是任何類型,那么就無法對他進行類型檢測。所以我認為項目中應該盡力避免使用any,可以在校驗規(guī)則中把any的判斷加上,強制不允許使用any類型
寫在最后
- 最后這點感受雖然是引用別人的話,但是和我的想法幾乎完全一致,所以就直接復制過來了:
說了這么多,如果你問我是否推薦 TypeScript,我只能說看情況。type check 對于大型項目來說太重要了。讀和寫代碼的時候,有 type 也會在一些方面提高程序員的效率。但是我認為 TypeScript 可以提高的空間還有很多。如果你很在乎開發(fā)速度,快速迭代,那么建議你繼續(xù)用 JavaScript。如果你需要高穩(wěn)定性,那么建議你使用 TypeScript。