TypeScript 基本型別 (Basic Types)
TypeScript 提供了豐富的型別系統,讓我們可以明確地標註變數、函式參數和回傳值的型別。這一章我們先來認識最基本的幾種型別。
原始型別 (Primitive Types)
string (字串)
用來表示文字內容:
let name: string = '小明';
let greeting: string = `你好,${name}`;
let message: string = '歡迎學習 TypeScript';
number (數值)
TypeScript 中所有的數字都是浮點數,使用 number 型別:
let age: number = 25;
let price: number = 99.99;
let hex: number = 0xf00d; // 十六進位
let binary: number = 0b1010; // 二進位
let octal: number = 0o744; // 八進位
boolean (布林值)
只有兩個值:true 或 false:
let isActive: boolean = true;
let hasError: boolean = false;
null 和 undefined
這兩個型別分別只有一個值:
let u: undefined = undefined;
let n: null = null;
bigint (大整數)
用於表示非常大的整數 (ES2020+):
let bigNumber: bigint = 100n;
let anotherBig: bigint = BigInt(100);
symbol
用於建立唯一的識別符:
let sym1: symbol = Symbol('key');
let sym2: symbol = Symbol('key');
// sym1 !== sym2,即使描述相同
特殊型別
any
any 型別可以接受任何值,等於關閉型別檢查:
let anything: any = 4;
anything = 'hello';
anything = false;
anything.foo.bar; // 不會報錯,但可能在執行時出錯
盡量避免使用
any,它會讓你失去 TypeScript 的型別保護。如果真的不確定型別,考慮使用 unknown。unknown
unknown 是更安全的 any,在使用前必須進行型別檢查:
let value: unknown = 'hello';
// 直接使用會報錯
// console.log(value.length); // 錯誤!
// 必須先檢查型別
if (typeof value === 'string') {
console.log(value.length); // OK,這裡 value 被收窄為 string
}
void
表示沒有回傳值,通常用於函式:
function log(message: string): void {
console.log(message);
// 沒有 return 語句,或 return; 或 return undefined;
}
never
表示永遠不會有值的型別,用於:
- 永遠不會正常結束的函式:
function throwError(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {}
}
- 型別收窄後不可能存在的情況:
function example(x: string | number) {
if (typeof x === 'string') {
// x 是 string
} else if (typeof x === 'number') {
// x 是 number
} else {
// x 是 never,因為已經窮盡所有可能
const exhaustiveCheck: never = x;
}
}
物件型別
object
object 表示非原始型別的值:
let obj: object = { name: '小明' };
let arr: object = [1, 2, 3];
let fn: object = function () {};
// 原始型別不能指派給 object
// let str: object = "hello"; // 錯誤
物件字面量型別
更精確地定義物件的結構:
let user: { name: string; age: number } = {
name: '小明',
age: 25,
};
陣列型別
有兩種寫法:
// 方式一:型別[]
let numbers: number[] = [1, 2, 3];
let names: string[] = ['Alice', 'Bob'];
// 方式二:Array<型別>
let scores: Array<number> = [90, 85, 92];
let items: Array<string> = ['a', 'b', 'c'];
型別推論
TypeScript 會根據初始值自動推論型別,所以很多時候不需要明確標註:
// TypeScript 自動推論這些變數的型別
let name = '小明'; // string
let age = 25; // number
let isActive = true; // boolean
let numbers = [1, 2, 3]; // number[]
型別轉換
字串轉數字
let str: string = '42';
let num: number = Number(str);
let num2: number = parseInt(str, 10);
let num3: number = +str; // 使用 + 運算子
數字轉字串
let num: number = 42;
let str: string = String(num);
let str2: string = num.toString();
let str3: string = `${num}`; // 模板字串
型別比較表
| 型別 | 說明 | 範例 |
|---|---|---|
string | 字串 | "hello" |
number | 數值 | 42, 3.14 |
boolean | 布林值 | true, false |
null | 空值 | null |
undefined | 未定義 | undefined |
bigint | 大整數 | 100n |
symbol | 符號 | Symbol("id") |
any | 任意型別 | 任何值 |
unknown | 未知型別 | 任何值,但需型別檢查 |
void | 無回傳值 | 函式不回傳值 |
never | 永不存在 | 拋出例外的函式 |