今天開始正式進入 TypeScript
,把程式加上「型別」這層保護網,讓 API 更安全、更有結構。
寫 JS 的時候常遇到這種情況:
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, "3")); // "23" (意外!)
因為 JavaScript
是「動態型別」,數字 + 字串就被自動轉型成字串,程式不會報錯,但結果可能不符合預期。
TypeScript
可以幫我在「編譯階段」就檢查出問題。
TypeScript
在變數後面加上 : type
就能限制。
let name: string = "小明";
let age: number = 20;
let isStudent: boolean = true;
let scores: number[] = [80, 90, 100];
如果型別不符合,編譯就會報錯:
let age: number = "20"; // ❌ 錯誤:不能把字串指定給 number
interface
可以幫我定義物件的結構:
interface Student {
name: string;
age: number;
score?: number; // 可選屬性
}
let s1: Student = {
name: "小明",
age: 18,
score: 90
};
let s2: Student = {
name: "小美",
age: 19
// score 可有可無
};
這樣就能確保學生物件一定有 name
和 age
,而 score
則是可選的。
除了 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";
來重寫 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 與函式型別,再往下一步邁進 🚀