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 (布林值)

只有兩個值:truefalse

let isActive: boolean = true;
let hasError: boolean = false;

null 和 undefined

這兩個型別分別只有一個值:

let u: undefined = undefined;
let n: null = null;
strictNullChecks 模式下 (建議開啟),nullundefined 不能指派給其他型別,除非使用聯合型別明確允許。

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

表示永遠不會有值的型別,用於:

  1. 永遠不會正常結束的函式:
function throwError(message: string): never {
  throw new Error(message);
}

function infiniteLoop(): never {
  while (true) {}
}
  1. 型別收窄後不可能存在的情況:
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永不存在拋出例外的函式