TypeScript類型檢查詳談及火爆原因

TypeScript 這些年越來越火,可以說是前端工程師的必備技能瞭,各大框架都基於它實現。

那麼,TypeScript 的出現和爆火是偶然發生的嗎?其實不是,類似 TypeScript 這種靜態類型語言成為主流是必然會發生的。為什麼這麼說呢?

讓我們先思考一個問題:類型是什麼?

類型具體點來說就是指 number、boolean、string 等基礎類型和 Object、Function 等復合類型,它們是編程語言提供的對不同內容的抽象:

不同類型變量占據的內存大小不同:boolean 類型的變量隻會分配 1 個字節的內存,而 number 類型的變量則會分配 8 個字節的內存,給變量聲明瞭不同的類型就代表瞭會占據不同的內存空間。

不同類型變量可做的操作不同:number 類型可以做加減乘除等運算,boolean 就不可以,復合類型中不同類型的對象可用的方法不同,比如 Date 和 RegExp,變量的類型不同代表可以對該變量做的操作就不同。

我們知道瞭什麼是類型,那自然可以想到類型和所做的操作要匹配才行,這就是為什麼要做類型檢查。

如果能保證對某種類型隻做該類型允許的操作,這就叫做類型安全**。比如你對 boolean 做加減乘除,這就是類型不安全,你對 Date 對象調用 exec 方法,這就是類型不安全。反之,就是類型安全。

所以,類型檢查是為瞭保證類型安全的。

類型檢查可以在運行時做,也可以運行之前的編譯期做。這是兩種不同的類型,前者叫做動態類型檢查,後者叫做靜態類型檢查。兩種類型檢查各有優缺點。

動態類型檢查

在源碼中不保留類型信息,對某個變量賦什麼值、做什麼操作都是允許的,寫代碼很靈活。但這也埋下瞭類型不安全的隱患,比如對 string 做瞭乘除,對 Date 對象調用瞭 exec 方法,這些都是運行時才能檢查出來的錯誤。

其中,最常見的錯誤應該是

“null is not an object”、“undefined is not a function”

之類的瞭,寫代碼時沒發現類型不匹配,到瞭運行的時候才發現,就會有很多這種報錯。

所以,動態類型雖然代碼寫起來簡單,但代碼中很容易藏著一些類型不匹配的隱患。

靜態類型檢查

則是在源碼中保留類型信息,聲明變量要指定類型,對變量做的操作要和類型匹配,會有專門的編譯器在編譯期間做檢查。

靜態類型給寫代碼增加瞭一些難度,因為你除瞭要考慮代碼要表達的邏輯之外,還要考慮類型邏輯:變量是什麼類型的、是不是匹配、要不要做類型轉換等。

不過,靜態類型也消除瞭類型不安全的隱患,因為在編譯期間就做瞭類型檢查,就不會出現對 string 做瞭乘除,調用瞭 Date 的 exec 方法這類問題。

所以,靜態類型雖然代碼寫起來要考慮的問題多一些,會復雜一些,但是卻消除瞭代碼中潛藏類型不安全問題的可能。

知道瞭動態類型檢查和靜態類型檢查的區別,我們自然可以得出這樣的結論:

動態類型隻適合簡單的場景,對於大項目卻不太合適,因為代碼中可能藏著的隱患太多瞭,萬一線上報一個類型不匹配的錯誤,那可能就是大問題。

而靜態類型雖然會增加寫代碼的成本,但是卻能更好的保證代碼的健壯性,減少 Bug 率。

所以,大型項目註定會用靜態類型語言開發。

JavaScript 本來是為瞭瀏覽器的表單驗證而設計的,所以就設計成瞭動態類型的,寫代碼比較簡單。

但 JavaScript 也沒想到它後來會被用來開發各種項目,比如 PC 和移動端的網頁、React Native 跨端 App、小程序、Electron 桌面端、Node.js 服務端、Node.js 工具鏈等。

開發各種大型項目的時候,JavaScript 的動態類型語言的缺點就暴露出來瞭,bug 率太高瞭,健壯性很難保證。那自然就有瞭對靜態類型的強烈需求,於是 TypeScript 應運而生。

TypeScript 給 JavaScript 添加瞭一套靜態類型系統,從動態類型語言變成瞭靜態類型語言,可以在編譯期間做類型檢查,提前發現一些類型安全問題。

而且,因為代碼中添加瞭靜態類型,也就可以配合編輯器來實現更好的提示、重構等,這是額外的好處。

所以,TypeScript 的火爆是一個偶然麼?不,我覺得是必然,因為大型項目註定會用靜態類型語言來開發。

總結

類型決定瞭變量的內存大小和可以對它進行的操作,保證對什麼類型隻做什麼操作就叫做類型安全,而保證類型安全的方式就是類型檢查。

類型檢查可以在運行時做,叫做動態類型檢查,也可以在編譯時做,叫做靜態類型檢查。

動態類型可能藏在代碼裡的隱患太多瞭,bug 率比較高,所以大型項目註定會用靜態類型語言來開發。

JavaScript 本身是一門動態類型語言,因為被越來越多的用來開發各種大型項目,所以就有瞭對靜態類型的需求。TypeScript 就滿足瞭這個需求。而且還有額外的更好的提示、更易於重構的好處。

所以,TypeScript 的出現和現在的火爆是必然會發生的。

以上就是TypeScript類型檢查詳談及火爆原因的詳細內容,更多關於TypeScript類型檢查的資料請關註WalkonNet其它相關文章!

推薦閱讀: