【TypeScript 入門教學】#02 基本型別標註:string、number、boolean、array

測驗:TypeScript 基本型別標註

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

1. 在 TypeScript 中,number 型別可以存放哪些值?

  • A. 只能存放整數
  • B. 整數和小數都可以
  • C. 只能存放正數
  • D. 整數用 int,小數用 number

2. 以下哪種情況,TypeScript 可以自動推斷變數型別,不需要手動寫型別標註?

// 情境 A let count = 0; // 情境 B let username: string; // 情境 C function greet(name: string) { … }
  • A. 情境 A:有初始值的變數宣告
  • B. 情境 B:沒有初始值的變數宣告
  • C. 情境 C:函式的參數
  • D. 三種情境都需要手動標註

3. string[]Array<string> 這兩種寫法有什麼差別?

  • A. string[] 只能放固定長度的陣列,Array<string> 長度不限
  • B. Array<string> 效能比較好
  • C. 功能完全一樣,只是風格不同
  • D. Array<string> 是舊語法,已被棄用

4. 看到以下函式定義,哪一段白話翻譯最正確?

function log(message: string): void { console.log(message); }
  • A. 接收一個文字 message,回傳一個空字串
  • B. 接收任意型別的 message,不回傳任何東西
  • C. 接收一個文字 message,回傳 undefined
  • D. 接收一個文字 message,不回傳任何東西

5. AI 產生了以下程式碼,編輯器顯示錯誤訊息:Type 'number' is not assignable to type 'string'。這代表什麼?

let name: string = 123;
  • A. 變數 name 不能叫這個名字
  • B. 你把數字塞進了應該放文字的變數裡
  • C. string 型別已被棄用,應改用 text
  • D. 需要先把 123 轉成字串才能賦值,但程式會正常執行

一句話說明

型別標註告訴 TypeScript「這個變數應該放什麼類型的資料」,寫錯就會提早報錯。


為什麼要看懂型別標註?

當你請 AI 幫你寫 TypeScript,幾乎每一行都會出現 : string: number 這類標記。看不懂它們,就無法確認 AI 寫的東西是不是你要的。

好消息是:基本型別標註非常直覺,花五分鐘就能全部看懂。


最小範例

let name: string = "Alice";
let age: number = 25;
let active: boolean = true;
Code language: JavaScript (javascript)

就這樣。冒號後面的就是「型別標註」,告訴 TypeScript 這個變數只能放這種資料。


逐行翻譯:基本型別

let name: string = "Alice";    // name 是文字,目前的值是 "Alice"
let age: number = 25;          // age 是數字,目前的值是 25
let active: boolean = true;    // active 是布林值(true 或 false)
Code language: JavaScript (javascript)

翻譯成白話:

「建立一個叫 name 的變數,它的型別是 string(文字),初始值是 “Alice”。」

必看懂:三大基本型別

型別 意思 可以放什麼 範例
| string | 文字 | 任何文字 | "hello"'world'、` hi ${name} | | number | 數字 | 整數、小數都算 | 423.14-1 | | boolean | 布林值 | 只有兩種值 | truefalse | 重點:TypeScript 的 number 不分整數和小數,全都是 number。 --- ## 型別推論:不寫標註也行 TypeScript 其實很聰明。你給它初始值,它自己就能推斷型別: %%CODEBLOCK1daebc84e2f94a75bd7b421f5f84f742%% **這在幹嘛**:這叫「型別推論」(type inference)。你沒寫 : string,但 TypeScript 看到 “Alice” 就知道是 string。 ### 那什麼時候要寫、什麼時候不用寫? %%CODEBLOCK933fb96e84b54d20819e0a742d3bed28%% **Vibe Coder 小結**:AI 生成的程式碼裡,有些變數有寫標註、有些沒寫,這是正常的。有初始值的地方通常會省略,函式參數幾乎都會寫。 --- ## 陣列型別:兩種寫法,同一件事 AI 生成的程式碼裡,你會看到兩種陣列型別的寫法: %%CODEBLOCKfccc9bf783924fd79e19ba4697c9ede3%% ### 逐行翻譯 %%CODEBLOCK53c25e9da18e457d8633d76ef8a44bf4%% 翻譯成白話: > 「names 是一個陣列,裡面每個元素都必須是 string。」 ### 兩種寫法的對照 | 寫法 1 | 寫法 2 | 翻譯 | |--------|--------|------| | string[] | Array | 文字陣列 | | number[] | Array | 數字陣列 | | boolean[] | Array | 布林值陣列 | 兩種寫法功能完全一樣,只是風格不同。AI 比較常用 string[] 這種簡短寫法。 --- ## any 型別:逃生口,但要小心 %%CODEBLOCK0058dc11cb174b2ebc77ae9a97f2a239%% **這在幹嘛**:any 是「什麼型別都行」的意思。TypeScript 不會檢查它,等於暫時關掉型別保護。 ### 什麼時候會看到 any? %%CODEBLOCKe96d64f69edc4d4ba7bd1c6c195334f7%% ### 必看懂:any 的風險 %%CODEBLOCKb39dffe575184556a6539517f3c79b53%% 用了 any,TypeScript 就不會幫你抓錯。等於你花力氣用 TypeScript,卻把保護關掉了。 > 看到 AI 寫了 any,可以問它:「能不能用更精確的型別?」 --- ## 函式參數與回傳值的型別標註 這是 AI 生成程式碼中最常見的型別標註場景: ### 最小範例 %%CODEBLOCK4407aa8850324a25bc5b4bf8d072802d%% **翻譯**:「greet 函式接收一個文字參數 name,回傳一個文字。」 ### 常見變化 **變化 1:箭頭函式** %%CODEBLOCK77dc650dbf044e79850042933e8c0978%% **翻譯**:跟上面一模一樣,只是用箭頭函式的寫法。 **變化 2:多個參數** %%CODEBLOCK65754d5e3b2c467fbf67d86d6f83593b%% **翻譯**:「接收兩個數字 a 和 b,回傳一個數字(它們的和)。」 **變化 3:不回傳東西** %%CODEBLOCK78e17fc6c69642a8b2ef27569bec24dd%% **翻譯**:「接收一個文字 message,不回傳任何東西。void 就是『沒有回傳值』的意思。」 **變化 4:可選參數** %%CODEBLOCK5554bf56ab92419ea7045247a7554a57%% **翻譯**:「name 一定要傳,greeting 可傳可不傳。沒傳就用預設值 "Hello"。」 ### 回傳型別通常可以省略 %%CODEBLOCK84c3d749c74b4154af78794fcb545bb6%% 兩種都正確。AI 有時候會寫、有時候省略,都是正常的。 --- ## 型別錯誤怎麼讀 當你在 AI 幫你寫的程式碼中看到紅色底線或錯誤訊息,先別慌。大部分型別錯誤都是同一種模式: ### 最常見的錯誤訊息 **錯誤 1:型別不匹配** %%CODEBLOCKfdeaf30c151a44c2a02bb9dda72b9aed%% 翻譯:「你把數字塞進了一個應該放文字的地方。」 %%CODEBLOCKa7e18c203e7c4c50ae754ec0e7c68f69%% **錯誤 2:缺少屬性** %%CODEBLOCKf33e074a1f314fb0a06da8aae4462232%% 翻譯:「這裡需要有 email 欄位,但你沒給。」 **錯誤 3:參數型別錯誤** %%CODEBLOCKab4fc86e761647888d9439fe02443bbc%% 翻譯:「這個函式要的是數字,你傳了文字進去。」 ### 讀錯誤訊息的公式 TypeScript 的錯誤訊息幾乎都是這個格式: %%CODEBLOCK6ac41ab49a5a4d69b1dbc6121eec76ac%% 翻譯公式:**「你給了 A,但這裡需要 B。」** 記住這個公式,九成的型別錯誤訊息你都能看懂。 --- ## 完整範例:把所有概念串起來 下面這段程式碼可能是 AI 幫你寫出來的,現在你應該每一行都看得懂了: %%CODEBLOCKe0aa2ac4a8a141f0bdd97db45c27159b%% --- ## 必看懂 vs 知道就好 ### 必看懂(天天會遇到) - : string: number: boolean -- 基本型別標註 - string[]number[] -- 陣列型別 - 函式的 (param: type): returnType -- 參數和回傳型別 - ? 可選參數和 void 無回傳值 ### 知道就好(遇到再查) - Array -- 陣列的另一種寫法,跟 string[] 一樣 - any -- 逃生口,看到就留意 - 型別推論 -- TypeScript 會自動推斷,不用每次都手寫 --- ## Vibe Coder 檢查點 看到 AI 寫的 TypeScript 程式碼時確認: - [ ] 函式參數有沒有型別標註?(沒有可能導致 any) - [ ] 有沒有用 any?(如果有,問 AI 能不能用更精確的型別) - [ ] 陣列型別對嗎?(string[]` 裡面應該都是文字)

  • [ ] 型別錯誤訊息看得懂嗎?(記住公式:「你給了 A,但這裡需要 B」)

進階測驗:TypeScript 基本型別標註

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

1. AI 幫你生成了一段程式碼,其中有一個函式的參數沒有型別標註,你應該怎麼做? 情境題

function processData(data) { return data.name.toUpperCase(); }
  • A. 不用管,TypeScript 會自動推斷參數型別
  • B. 請 AI 加上更精確的型別標註,避免參數變成 any
  • C. 手動加上 : any 讓錯誤消失
  • D. 改用 JavaScript 就不會有這個問題

2. 你要建立一個函式,接收使用者名稱並印出歡迎訊息,不需要回傳任何值。以下哪個函式簽名最正確? 情境題

  • A. function welcome(name: string): string
  • B. function welcome(name: any): void
  • C. function welcome(name: string): void
  • D. function welcome(name): void

3. AI 產生了以下程式碼。你需要在 greet 函式中讓 greeting 參數變成可選的,預設為 “Hi”。哪個修改方式最恰當? 情境題

function greet(name: string, greeting: string): string { return `${greeting}, ${name}`; }
  • A. 把 greeting: string 改成 greeting: any
  • B. 把 greeting: string 改成 greeting: string = "Hi" 但不加問號
  • C. 刪除 greeting 參數,在函式內部寫死 “Hi”
  • D. 把 greeting: string 改成 greeting?: string,並在函式內用 greeting ?? "Hi" 處理預設值

4. 以下程式碼不會出現 TypeScript 編譯錯誤,但執行時會崩潰。問題出在哪裡? 錯誤診斷

let user: any = { name: “Alice” }; console.log(user.age.toString());
  • A. user 物件少定義了 age 屬性,TypeScript 應該會報錯
  • B. .toString() 方法不能用在數字上
  • C. user 用了 any 型別,TypeScript 不會檢查 user.age 是否存在,導致對 undefined 呼叫 .toString() 而崩潰
  • D. console.log 不支援接收 .toString() 的回傳值

5. 以下程式碼出現了錯誤訊息。根據錯誤訊息,應該怎麼修正? 錯誤診斷

// 程式碼 let scores: string[] = [90, 85, 100]; // 錯誤訊息 // Type ‘number’ is not assignable to type ‘string’.
  • A. 把陣列值改成字串:["90", "85", "100"]
  • B. 把型別標註改成 number[],因為陣列內容是數字
  • C. 改用 any[] 讓錯誤消失
  • D. 移除型別標註,讓 TypeScript 自己推斷

發佈留言

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