【TypeScript 入門教學】#01 TypeScript 是什麼?為什麼值得學?

測驗:TypeScript 是什麼?為什麼值得學?

共 5 題,點選答案後會立即顯示結果

1. TypeScript 和 JavaScript 之間的關係,下列哪個描述最正確?

  • A. TypeScript 是一個全新的程式語言,和 JavaScript 語法完全不同
  • B. TypeScript 是 JavaScript 的超集,所有合法的 JavaScript 都能在 TypeScript 中執行
  • C. TypeScript 是 JavaScript 的精簡版本,移除了一些不安全的功能
  • D. TypeScript 和 JavaScript 是兩個互不相容的語言,需要分別學習

2. TypeScript 的型別標註在什麼時候存在?

function add(a: number, b: number): number { return a + b; }
  • A. 型別標註在編譯後仍然保留,瀏覽器會用它來檢查錯誤
  • B. 型別標註只在程式執行時才會生效,編譯時不會檢查
  • C. 型別標註只在寫程式和編譯時存在,編譯後會被移除
  • D. 型別標註會被轉換成 JavaScript 的註解保留在程式碼中

3. JavaScript 是動態型別語言,這導致了什麼問題?

function greet(name) { return “Hello, ” + name.toUpperCase(); } greet(123); // ???
  • A. 程式碼在儲存時就會顯示錯誤,無法執行
  • B. 傳入錯誤型別的參數時,要等到程式執行到那一行才會出錯
  • C. JavaScript 會自動把 123 轉成字串,所以不會有任何錯誤
  • D. IDE 會阻止你執行這段程式碼,直到你修正型別

4. 下列關於 TypeScript 編譯流程的說明,何者正確?

  • A. 瀏覽器可以直接執行 .ts 檔案,不需要編譯
  • B. tsc 會把 TypeScript 編譯成二進位檔案供瀏覽器執行
  • C. tsconfig.json 是 TypeScript 的型別定義檔
  • D. .ts 檔案經過 tsc 編譯後會產生 .js 檔案,型別標註會被移除

5. 在 TypeScript 的 interface 定義中,description?: string? 代表什麼意思?

interface Product { id: number; name: string; price: number; description?: string; }
  • A. description 的值可以是任何型別
  • B. description 是可選欄位,可以有也可以沒有
  • C. description 的值不確定是不是字串,需要額外檢查
  • D. description 會在編譯時被移除,不會出現在最終程式碼中

一句話說明

TypeScript 就是 JavaScript 加上型別檢查,讓錯誤在寫的時候就被抓到。


為什麼要認識 TypeScript?

如果你用 AI 輔助開發,你幾乎一定會遇到 TypeScript。現在主流的前端框架(React、Next.js、Vue)、後端框架(Express、NestJS)、甚至 AI 工具自己產生的程式碼,預設都是 TypeScript。

看懂 TypeScript,就是看懂 AI 幫你寫的程式碼的第一步。


JavaScript 的問題在哪?

先看一段 JavaScript 程式碼:

function greet(name) {
    return "Hello, " + name.toUpperCase();
}

greet("Alice");   // "Hello, ALICE" -- 正常
greet(123);       // 執行時才爆炸:name.toUpperCase is not a function
Code language: JavaScript (javascript)

JavaScript 是動態型別語言,意思是:變數沒有固定的型別,什麼都能傳進去。問題是——你傳錯了,要等到程式真的跑到那一行才會出錯。

這會帶來三個痛點:

痛點 說明
執行時才爆炸 Bug 藏在程式碼裡,測試沒跑到就不知道
IDE 無法幫你 編輯器不知道 name 是什麼型別,無法提供自動補全
重構像拆炸彈 改了一個函式的參數,不知道哪些地方會壞掉

TypeScript = JavaScript + 型別系統

TypeScript 怎麼解決?很簡單——告訴程式每個東西是什麼型別

function greet(name: string) {
//                  ^^^^^^^^ 加了這個:name 必須是 string
    return "Hello, " + name.toUpperCase();
}

greet("Alice");   // 正常
greet(123);       // 寫的時候就報錯:不能把 number 傳給 string
Code language: JavaScript (javascript)

就這樣。TypeScript 的核心概念就是這一件事:幫變數、參數、回傳值標上型別

逐行翻譯

function greet(name: string) {
//             ^^^^^^^^^^^^ name 這個參數必須是文字
    return "Hello, " + name.toUpperCase();
//                          ^^^^^^^^^^^^^ 因為確定是文字,所以可以安全呼叫
}
Code language: JavaScript (javascript)

TypeScript 不是新語言

這是很多人搞混的地方。TypeScript 不是一個全新的語言,它是 JavaScript 的超集(superset)。

用白話說:

所有合法的 JavaScript 程式碼,直接貼到 TypeScript 裡面都能跑。TypeScript 只是「多了型別標註」。

圖解:

┌──────────────────────────────┐
│        TypeScript            │
│  ┌────────────────────────┐  │
│  │      JavaScript        │  │
│  │  (你已經會的部分)        │  │
│  └────────────────────────┘  │
│  + 型別標註                   │
│  + interface / type 定義     │
│  + 編譯時檢查                 │
└──────────────────────────────┘
Code language: PHP (php)

這代表:

  • 你學過的 JavaScript 知識全部有效
  • TypeScript 只是在上面「加東西」,不會取代任何東西
  • 你可以漸進式地加入型別,不需要一次改完

編譯流程:.ts 怎麼變成 .js?

瀏覽器和 Node.js 不認識 TypeScript,它們只認識 JavaScript。所以 TypeScript 需要一個編譯步驟,把 .ts 檔案轉成 .js 檔案。

你寫的程式碼          編譯器處理           瀏覽器/Node.js 執行
app.ts          →    tsc 編譯    →      app.js
(有型別標註)         (檢查型別、         (純 JavaScript,
                     移除型別標註)        型別標註全部消失)

最小範例

你寫的 app.ts

function add(a: number, b: number): number {
    return a + b;
}
Code language: JavaScript (javascript)

編譯後產生的 app.js

function add(a, b) {
    return a + b;
}
Code language: JavaScript (javascript)

看到了嗎? 編譯器只是把 : number 這些型別標註移除掉。TypeScript 的型別只存在於「寫程式的時候」,執行時完全不存在。

翻譯對照

你會看到的 意思
tsc TypeScript Compiler,把 .ts 編譯成 .js
tsconfig.json TypeScript 的設定檔,告訴編譯器怎麼編譯
.ts 檔案 TypeScript 原始碼
.tsx 檔案 TypeScript + JSX(React 用的)
.js 檔案 編譯後的 JavaScript,給瀏覽器執行
.d.ts 檔案 型別定義檔,只有型別沒有程式碼(知道就好)

TypeScript 的三大優勢

優勢 1:自動補全超好用

因為 TypeScript 知道每個變數的型別,IDE 可以精確提示你能用什麼:

const user = {
    name: "Alice",
    age: 25,
    email: "alice@example.com"
};

user.  // IDE 會自動列出:name, age, email
//     不用猜,不用查文件
Code language: JavaScript (javascript)

對 Vibe Coder 特別重要——當 AI 幫你產生了一個物件,你輸入 . 就能看到它有哪些屬性,不用讀完所有程式碼。

優勢 2:重構更安全

interface User {
    name: string;
    age: number;
}

// 如果你把 age 改名為 birthYear,
// TypeScript 會立刻標出所有用到 age 的地方
// 不用自己一個一個找
Code language: PHP (php)

優勢 3:型別就是文件

function createOrder(
    userId: string,
    items: CartItem[],
    coupon?: string        // ? 表示可選
): Promise<Order> {        // 回傳 Promise<Order>
    // ...
}
Code language: JavaScript (javascript)

光看函式簽名就知道:

  • 需要傳入 userId(文字)、items(購物車項目陣列)
  • coupon 可傳可不傳
  • 會回傳一個 Order(非同步)

不需要額外寫註解,型別本身就是最好的文件


什麼時候該用 TypeScript?

適合用 TypeScript

情境 原因
多人協作的專案 型別讓團隊成員更容易理解彼此的程式碼
中大型專案 程式碼越多,型別檢查越能幫你抓 Bug
用 AI 產生程式碼 有型別才看得懂 AI 在做什麼
使用框架(React、Next.js 等) 這些框架本身就用 TypeScript,配合更順

可以先不用 TypeScript

情境 原因
幾十行的小腳本 殺雞用牛刀,加型別反而更慢
快速原型驗證 先跑起來最重要,之後再加型別也行
學 JavaScript 的第一週 先把基礎搞懂,再來加型別

Vibe Coder 檢查點

當 AI 幫你產生 TypeScript 程式碼時,確認以下幾點:

  • [ ] 看到 : string: number 這些標註嗎?這是型別,告訴你這個變數是什麼
  • [ ] 檔案是 .ts.tsx 嗎?那就是 TypeScript,需要編譯才能執行
  • [ ] 有沒有看到紅色底線?那是 TypeScript 在告訴你型別不對,要處理
  • [ ] AI 有沒有用 any?盡量避免——any 等於放棄型別檢查

常見變化

AI 產生的 TypeScript 程式碼,你最常看到這幾種型別寫法:

變化 1:變數型別標註

let count: number = 0;
let name: string = "Alice";
let isReady: boolean = false;
Code language: JavaScript (javascript)

翻譯:冒號後面的就是型別,告訴你這個變數只能放什麼。

變化 2:函式參數和回傳值

function fetchUser(id: number): Promise<User> {
//                 ^^^^^^^^^   ^^^^^^^^^^^^^^^
//                 參數型別     回傳型別
    // ...
}
Code language: JavaScript (javascript)

翻譯:括號裡的 : number 是參數型別,括號外的 : Promise<User> 是回傳型別。

變化 3:interface 定義物件結構

interface Product {
    id: number;
    name: string;
    price: number;
    description?: string;   // ? 表示這個欄位可以沒有
}
Code language: PHP (php)

翻譯:定義一個 Product 資料結構,規定它必須有 id、name、price,description 可有可無。


本篇重點回顧

概念 一句話
TypeScript 是什麼 JavaScript 加上型別檢查
為什麼需要 讓錯誤在寫的時候就被抓到,不是跑的時候才爆炸
超集的意思 所有 JS 都是合法的 TS,TS 只是多加了型別
編譯流程 .ts 經過 tsc 編譯成 .js,型別在執行時不存在
最大優勢 自動補全、安全重構、型別即文件

下一篇預告

下一篇我們會實際動手,看看 TypeScript 的基本型別有哪些、怎麼讀懂 interfacetype 的定義。

進階測驗:TypeScript 是什麼?為什麼值得學?

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你正在用 AI 產生一個電商網站的程式碼,AI 生成了以下檔案。你想確認 AI 寫的購物車功能接受哪些參數、回傳什麼資料。最有效率的做法是什麼? 情境題

function createOrder( userId: string, items: CartItem[], coupon?: string ): Promise<Order> { // … 200 行程式碼 }
  • A. 把整個函式的 200 行程式碼從頭讀完,理解每一步邏輯
  • B. 直接看函式簽名的型別標註:參數需要 userId(字串)、items(購物車陣列)、coupon(可選字串),回傳 Promise<Order>
  • C. 請 AI 重新用 JavaScript 改寫,去掉型別標註比較好讀
  • D. 在瀏覽器的開發者工具中執行這個函式,觀察輸出結果來推測參數

2. 你的團隊正在評估一個新專案要用 JavaScript 還是 TypeScript。這個專案是 3 人協作的中型 React 應用,預計開發半年。根據文章的建議,最合理的決策是什麼? 情境題

  • A. 用 JavaScript 就好,TypeScript 學習成本太高,會拖慢開發速度
  • B. 先用 JavaScript 快速開發完,最後一次全部轉成 TypeScript
  • C. 使用 TypeScript,因為多人協作的中大型專案加上 React 框架,正是 TypeScript 的適用場景
  • D. 各自選擇,讓每個人用自己習慣的語言,反正 TypeScript 是 JavaScript 的超集

3. 你用 AI 產生了一段 TypeScript 程式碼,IDE 中沒有出現紅色底線,但你注意到 AI 大量使用了 any 型別。根據文章的建議,你應該怎麼做? 情境題

function processData(data: any): any { const result: any = data.map((item: any) => item.value); return result; }
  • A. 沒有紅色底線就代表程式碼沒問題,可以直接使用
  • B. 把所有 any 改成 unknown,這樣比較安全
  • C. 刪除所有型別標註,讓 TypeScript 自動推斷型別
  • D. 要求 AI 避免使用 any,改用具體的型別標註,因為 any 等於放棄了型別檢查

4. 小華寫了以下 TypeScript 程式碼,但在編譯時出現了錯誤。最可能的原因是什麼? 錯誤診斷

interface User { name: string; age: number; } const user: User = { name: “Alice”, age: 25, email: “alice@example.com” // 編譯錯誤! };
  • A. User 介面不能同時有 stringnumber 型別的屬性
  • B. const 宣告的變數不能指定 interface 型別
  • C. email 屬性不存在於 User 介面的定義中,TypeScript 不允許多出未定義的屬性
  • D. interface 定義的物件不能使用字串值,只能使用數字

5. 小明想在瀏覽器中直接引用他寫的 TypeScript 檔案,但頁面完全沒有反應。他的 HTML 如下,問題出在哪裡? 錯誤診斷

<!DOCTYPE html> <html> <body> <h1>My App</h1> <script src=”app.ts”></script> </body> </html>
  • A. HTML 檔案缺少 <meta charset="UTF-8">,導致編碼錯誤
  • B. 瀏覽器不認識 .ts 檔案,必須先用 tsc 編譯成 .js 檔案,再引用 app.js
  • C. <script> 標籤需要加上 type="typescript" 屬性才能載入 .ts 檔案
  • D. <script> 標籤的位置應該放在 <head> 裡面,而不是 <body> 裡面

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *