---
# System prepended metadata

title: Untitled

---

【TypeScript 小教室  02】

Q: 想學 TypeScript, 為什麼還是得先學 JavaScript 呢？不是說 TypeScript 就是用來解決 JavaScript 的問題嗎？

* * *

A: TypeScript 雖然能強化 JavaScript, 最終產出的依然是JavaScript 程式碼, 因為這是瀏覽器與 Node.js 等環境的通用語言。某些開發者之所以採用 TypeScript, 是因為他們想撰寫網頁應用程式, 卻又不想學JavaScript。這些人看到 TypeScript 是微軟推出的, 誤以為 TypeScript 是C# 或 Java 語言的網頁版, 結果就陷入了愁雲慘霧。

所以若要有效活用 TypeScript, 你就得對 JavaScript 語言本身有充足的認識, 並理解它為何會有某些奇怪的行為。本書第 3 章與第 4 章會帶各位快速入門 JavaScript 基礎、講解它的古怪特性, 好讓讀者能更充分理解TypeScript 這項工具的強大之處。

--- 旗標出版《TypeScript 邁向專家之路》Ch.2

* * *

我們來看書中第三章開頭提到的一個例子：

* * *

在 JavaScript 中, 當算符 ( 或稱運算子, 比如加減乘除) 被套用到不同型別的值時, JavaScript 執行環境會將其中一個轉換為另一個型別的值, 這個過程叫做強制轉型 (type coercion)。前面 index.js 執行後產生的詭異結果 ( 判定數值的 100 與字串的 100 相等, 以及相加兩者變成兩者相連) 便是發生了兩次強制轉型的結果, 但若你曉得這特色是如何運作的, 就知道它其實是預料中的結果。

let hatPrice = 100;  // 數值

let bootsPrice = "100";  // 字串

// 判斷 hatPrice 的值是否和 bootsPrice 相等

if (hatPrice == bootsPrice) { 

console.log("Prices are the same");

} else {

console.log("Prices are different");

}

這段程式碼執行後將產生下列結果：

Prices are the same

在 JavaScript 語法中, 雙等號 == 表示進行的是一般相等比較 (abstract equality comparison), 它會先將兩個變數的值轉換為相同的型別, 好產生有意義的比較結果。例如, 在比較數值與字串這兩種不同型別時, 字串值會被自動轉換為數值, 然後再進行比較。所以當 if 在比較hatPrice 是否等於 bootPrice 時, bootPrice 的 100 便從字串被轉成了數值, 這就是為什麼它們的比較結果會是 true ( 被認為相等)。...

--- 旗標出版《TypeScript 邁向專家之路》Ch.3

* * *

不過, 要是你將這段程式碼拿去給 TypeScript 編譯器編譯, 它會自動隱性推論 (見第 7 章) hatPrice 為 number 型別, bootsPrice 則是 string 型別, 而且用 == 比較時也不會發生強制轉型。你反而會得到一個錯誤訊息：

error TS2367: This condition will always return 'false' since the types 'number' and 'string' have no overlap.

(自己玩玩看：https://pse.is/3rnxv7)

這個錯誤訊息其實也是 TypeScript 的型別防衛敘述 (type guard) 發揮了作用, 告訴你說拿 number 和 string 型別比較是絕不可能成立的, 因此 if...else 裡只有 else 條件會執行。本書第 7 章與後續章節會談到更多 type guard 的使用情境。

由上可知, 藉由 TypeScript 的強大功能, 你就能避免程式碼中難以除錯的無心之過 (例如意外將字串打成數值), 並在 JS 程式執行之前就揪出問題。

去哪裡買 旗標出版《TypeScript 邁向專家之路》?
https://pse.is/3mr25v
