【前端開發】TypeScript 是什麼?優化 JavaScript 開發體驗的程式語言

更新於 發佈於 閱讀時間約 7 分鐘
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
這篇文章主要會分享:TypeScript 是什麼?它要達到什麼樣目的?TypeScript 是透過怎麼樣的手段來優化 JavaScript 的開發體驗,以及自己使用了 React TypeScript 開發半年以上後的心得感想。
在這篇文章中,我不會分享實際的應用範例,因為那樣篇幅可能會太長,如果以後有機會的話,會再依照語法主題式地跟大家分享,那麼就讓我們開始吧!

TypeScript 是什麼?

TypeScript 是 JavaScript 的超集,通過引入靜態型別檢查和額外的語言特性,為 JavaScript 開發人員提供了更強大的工具和能力。它保留了 JavaScript 的彈性和兼容性,同時提供了更好的可讀性、可維護性和可靠性。
相信有些人可能會有跟我一開始接觸 TypeScript 時一樣的困惑,什麼是超集?什麼又是靜態型別檢查呢?
超集(Superset)是指包含或涵蓋另一個集合的集合。換句話說,如果集合 A 中的所有元素也是集合 B 中的元素,那麼集合 A 就是集合 B 的超集。
以程式語言為例,有時會將一種語言稱為另一種語言的超集。意思是這種語言包含了另一種語言的所有語法和功能,並且可能還擴展了一些額外的功能。在這種情況下,該語言被稱為超集,而被包含的語言則被稱為子集。
也就是說,TypeScript 可以被稱為 JavaScript 的超集。 TypeScript 包含了 JavaScript 的所有語法和功能,我們可以在符合 TypeScript 所規範的模式下撰寫 JavaScript,只有稍微改變撰寫程式碼的語法,並且理解 TypeScript 所要解決的問題,就可以獲得 TypeScript 強大的好處。
了解 TypeScript 與 JavaScript 最基本的關係後,接著讓我們來聊聊什麼是「靜態型別系統」。

靜態型別系統

如果對 JavaScript 有一點了解的話,會知道以現代的網頁開發來說,我們會使用各式各樣的打包工具來優化 JavaScript 的相容性,使其可以在不同的瀏覽器中運作。
在 JavaScript 程式碼從本地到能在伺服器執行,主要會經歷以下過程:「編譯 → 執行」。
我們的開發環境會依照專案中的一些設定檔案、套件來編譯出符合需求的程式碼,而 TypeScript 的靜態型別系統會在程式碼編譯時,將用 TypeSrcipt 撰寫的程式碼轉譯成 JavaScript,並且根據上下文去檢查型別正不正確。
這裡大家可能會對「靜態」這件事感到疑惑,難道在使用 TypeScript 以前 JavaScript 是動態的產生型別嗎?
沒錯,JavaScript 還真的是動態產生型別的,在編譯 JavaScript 的過程中,JavaScript 並不會知道我們撰寫的程式碼實際上的型別是什麼,要等到執行的時候才會知道 JavaScript 變數、表達式回傳值的實際型別。
有些人可能會聯想到:「這是不是跟 JavaScript 是弱型別有關係呢?」
是的,因為在 JavaScript 執行的過程中,變數裡頭的值會做自動轉型,當遇到一些情境時 JavaScript 會把這些值用一些方式轉型去符合當下的運算情境,例如:在 if 判斷式中的條件如果帶入基本型別,JavaScript 就會轉成布林值以方便進行後續的流程判斷。
這會衍生出一個問題是,當今天我們在某一行程式碼使用了預期外的型別,我們就要等到它被執行時,我們才會知道它是不是有問題,這會讓 JavaScript 變得非常難除錯。
而 TypeScript 就是一個可以讓我們在編譯時,預先檢查程式碼是否有型別上的問題,不會等到執行時才報錯。
這裡有個重要的點需要知道,因為 JavaScript 終究是動態型別系統,TypeScript 只是一個輔助在編譯時檢查錯誤的工具,還是有可能在程式碼執行時遇到預期外有關型別的問題,因為 TypeScript 並沒有辦法在編譯時提前知道實際丟進來的資料型別是什麼,不過這一點可以透過熟悉 TypeScript 的語法來解決。
所以 TypeScript 到底是什麼呢?其實它就是一門透過靜態型別系統更嚴謹撰寫 JavaScript 的程式語言,並且協助將其語法轉譯成 JavaScript 的編譯器(畢竟瀏覽器是讀不懂 TypeScript 的)。

TypeScript 可以解決什麼問題

在前文我們有提到,在 JavaScript 程式碼從本地到能在伺服器執行會經歷以下過程:「編譯 → 執行」。 相信大家可能都曾經遇過,以下情境:明明編譯都編過了,等到要觸發某段程式碼的時候才發現:「哇勒?怎麼會是 undefined ?」或是在某某物件底下找不到預期出現的屬性,或是最常出現的拼字錯誤也難以檢查出來。
如果是使用 React 進行開發的話,甚至可能會出現元件層級層層疊疊,明明知道一定是屬性傳入有誤導致元件資料出不來,但就是怎麼都找不到問題,最後才發現自己根本把屬性的名稱拼錯了。
使用 TypeScript 雖然不能完全避免關於資料傳遞的各種問題,但我們可以:
  1. 在編譯時就發現問題,避免預期外的空值
  2. 定義使用者界面,使用元件時會有對應提示,不用擔心會帶錯屬性
  3. 建立更嚴謹的程式碼撰寫風格
是不是聽起來超級香的?

使用心得

經歷過幾個大型專案的開發後,我認為 TypeScript 有優點有缺點,優點的效益遠遠超過克服缺點的所需要花的成本,優點的部分前文有提過了,所以我們就來聊聊使用 TypeScript 的缺點吧:
  1. 較難精通,對程式菜鳥而言學習曲線較高
  2. 如果沒有一套管理模式,會淪為一種裝飾用的工具,例如:不太確定怎麼撰寫型別時,就都使用 any 這個型別(也就是任意型別都可以符合)打天下,還不如一開始就使用 JavaScript 撰寫就好了
以上缺點我認為是前端的原罪,如果要導入、學習一個工具,一定都會有對應的學習成本以及衍生的管理成本,所以除了這兩個缺點外,可能還有其他的缺點,不過我暫時沒想到。
值得一提的是,如果想要嘗試撰寫 TypeScript 的話,並不需要靠自己完全整合,現代的前端框架可以在啟動新專案時直接建立對應的模板,可以說隨著前端技術的演進,TypeScript 的開發門檻逐漸降低了。
雖然這篇文章並沒有提到實際範例,主要是想要跟大家分享,TypeScript 其實並沒有想像中的難理解,只要持續的開發、練習或是觀摩其他人的作法,就可以慢慢透過它提升開發體驗。
現在的我可以說根本離不開 TypeScript 了,因此非常推薦大家花時間投資研究!
希望本篇文章可以讓初學 TypeScript 的人,更了解其在前端開發領域所扮演的角色為何,希望之後可以再把 TypeScript 的使用情境跟大家分享,我是 Vivian ,我們下次見。

關於我:
一名從英文系畢業的前端工程師,喜歡閱讀、寫東西及自我成長。
|聯絡我:vivian.enlife@gmail.com
為了追求可以窩在座位上、可以心無旁騖思考問題、座位可以亂七八糟沒關係、不需要到處哈腰點頭跑客戶,不用腳踩十公分、連妝都可以不用化的職場人生,文組少女毅然決然踏上RD的養成日常。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
前端工程師可能會隨著工作經驗的累積,而開始想要寫出更好的網頁架構,又或者是能有一套方法讓組織間的溝通、工作模式更加順暢。
Firebase Realtime Database 是一個 NoSQL 即時雲端資料庫,支援多平台(JavaScript SDKs、Android、iOS),可以讓使用者即時取得資料庫的資料。
Functional Programming 中文譯作函式程式設計,或是功能性程式設計,常簡稱為:FP,是一種透過使用純函式(Pure Funciton)進行軟體開發,且避免副作用的程式設計典範,比起宣告式的流程控制,在 FP 採用主要以表達式的方式撰寫程式碼。
前端工程師可能會隨著工作經驗的累積,而開始想要寫出更好的網頁架構,又或者是能有一套方法讓組織間的溝通、工作模式更加順暢。
Firebase Realtime Database 是一個 NoSQL 即時雲端資料庫,支援多平台(JavaScript SDKs、Android、iOS),可以讓使用者即時取得資料庫的資料。
Functional Programming 中文譯作函式程式設計,或是功能性程式設計,常簡稱為:FP,是一種透過使用純函式(Pure Funciton)進行軟體開發,且避免副作用的程式設計典範,比起宣告式的流程控制,在 FP 採用主要以表達式的方式撰寫程式碼。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
本文帶你深入探索 TypeScript 中的 satisfies 特性,能幫助你實現精確的型別推導與型別檢查。透過實際案例,展示如何使用 satisfies 提升代碼的型別安全與程式碼的整潔,是每位 TypeScript 開發者不可或缺的知識。
Thumbnail
類別 (class) 是在 ES6 中引入,用來作為建立新物件的模板。它可以將程式碼封裝起來。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
本文帶你深入探索 TypeScript 中的 satisfies 特性,能幫助你實現精確的型別推導與型別檢查。透過實際案例,展示如何使用 satisfies 提升代碼的型別安全與程式碼的整潔,是每位 TypeScript 開發者不可或缺的知識。
Thumbnail
類別 (class) 是在 ES6 中引入,用來作為建立新物件的模板。它可以將程式碼封裝起來。