iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
自我挑戰組

《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》系列 第 19

Day19 - 持續成長學習藍圖 - TypeScript(type 與 interface)

  • 分享至 

  • xImage
  •  

今天開始正式進入 TypeScript,把程式加上「型別」這層保護網,讓 API 更安全、更有結構。


1. 為什麼要用 TypeScript?

寫 JS 的時候常遇到這種情況:

function add(a, b) {
  return a + b;
}

console.log(add(2, 3));     // 5
console.log(add(2, "3"));   // "23" (意外!)

因為 JavaScript 是「動態型別」,數字 + 字串就被自動轉型成字串,程式不會報錯,但結果可能不符合預期。

TypeScript 可以幫我在「編譯階段」就檢查出問題。


2. 基本型別 – type

TypeScript 在變數後面加上 : type 就能限制。

let name: string = "小明";
let age: number = 20;
let isStudent: boolean = true;

let scores: number[] = [80, 90, 100];

如果型別不符合,編譯就會報錯:

let age: number = "20"; // ❌ 錯誤:不能把字串指定給 number

3. 物件型別 – interface

interface 可以幫我定義物件的結構:

interface Student {
  name: string;
  age: number;
  score?: number; // 可選屬性
}

let s1: Student = {
  name: "小明",
  age: 18,
  score: 90
};

let s2: Student = {
  name: "小美",
  age: 19
  // score 可有可無
};

這樣就能確保學生物件一定有 nameage,而 score 則是可選的。


4. type alias 與 interface 差異

除了 interface,還有 type 也能定義型別:

type Point = {
  x: number;
  y: number;
};

let p: Point = { x: 10, y: 20 };

差別在於:

  • interface 偏向定義物件結構,可以「擴充」
  • type 更靈活,除了物件,也能定義 union(聯合型別)
type ID = string | number;

let userId: ID = 123;
let anotherId: ID = "abc";

5. 實作練習:平均分數

來重寫 Day 1 的「平均分數」練習,但這次用 TypeScript

function average(numbers: number[]): number {
  let sum = numbers.reduce((acc, n) => acc + n, 0);
  return numbers.length > 0 ? sum / numbers.length : 0;
}

console.log(average([80, 90, 100])); // 90
console.log(average([]));            // 0

這樣一來,函式只能接受 number[],如果不小心丟了字串,就會報錯:

average(["80", "90"]); // ❌ 錯誤:不能把 string[] 指定給 number[]

🎯 學習心得 / 今日收穫

今天第一次正式寫 TypeScript,感受到它跟 JavaScript 的不同:

  • 宣告變數時加上型別,就像幫它上了一層保護殼
  • interface 可以清楚定義物件結構,避免少屬性或多屬性
  • TypeScript 重寫「平均分數」的範例,明顯比 JavaScript 更安全

最大的心得是:TypeScript 雖然一開始要多寫一些東西,但能換來程式的可讀性與安全性
比起「到時候爆炸才 debug」,我更喜歡「在編譯階段就被提醒」。

明天 Day 20,要來學 Enum 與函式型別,再往下一步邁進 🚀


上一篇
Day18 - 持續成長學習藍圖 - Node.js(小作品_Todo API 整合)
下一篇
Day20 - 持續成長學習藍圖 - TypeScript(Enum 與函式型別)
系列文
《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言