TypeScript 基本型別 (Basic Types)

在 TypeScript 中,我們最常打交道的不是複雜的類別或介面,而是這些最基礎的型別。掌握它們,是寫好 TypeScript 的第一步。

原始型別 (Primitive Types)

這些是你會最常使用到的型別,它們直接對應到 JavaScript 的原始型別。

string (字串)

不管是單引號 '、雙引號 " 還是反引號 ` (Template Literal),都屬於 string

let name: string = '小明';
let message: string = `Hello, ${name}`;

number (數字)

在 JavaScript/TypeScript 中,沒有分什麼 int 或 float,所有數字(包含整數、浮點數、十六進位)統統都是 number

let age: number = 25;
let price: number = 99.99;
let hex: number = 0xff;

boolean (布林值)

只有兩個值:truefalse

let isDone: boolean = false;

nullundefined

這兩個比較特殊。在 JavaScript 中它們既是值也是型別。

在 TypeScript 中,它們的使用取決於 strictNullChecks 設定(強烈建議開啟):

  • 開啟時 (Strict)null 只能指派給 null 型別,undefined 只能指派給 undefined。你不能把 null 塞給 number 變數。
  • 關閉時 (Loose):它們是所有型別的子型別,也就是說你可以把 null 指派給 number (這很容易導致 bug)。
let u: undefined = undefined;
let n: null = null;

特殊型別 (Special Types)

這些是 TS 為了處理某些特殊場景而發明的型別。

any (隨便啦)

any 是 TypeScript 的「逃生門」。當你把一個變數標記為 any,就像是告訴 TS:「請閉嘴,不要檢查這個變數,我說了算」。

let notSure: any = 4;
notSure = 'maybe a string instead';
notSure = false; // 都可以,完全沒限制

notSure.hello(); // 編譯會過,但執行時可能會爆掉 (Runtime Error)

注意:盡量少用 any。用太多 any,那你還不如直接寫 JavaScript。

unknown (不知道是啥)

unknown安全版any。它表示:「我還不知道這變數是什麼,所以在確認之前,你不能隨便用它」。

let value: unknown = 4;

// value.toFixed(); // 錯誤!TS 不准你亂用,因為它是 unknown

// 你必須先「檢查」它,縮小範圍後才能用
if (typeof value === 'number') {
  console.log(value.toFixed(2)); // OK!現在 TS 知道它是 number 了
}

void (空)

通常用在函式回傳值,表示這個函式「不回傳任何東西」。

function warnUser(): void {
  console.log('This is my warning message');
  // 這裡沒有 return,或者 return undefined
}

never (絕不)

表示那些「永遠不存在」的值。這很抽象,常見於兩種情況:

  1. 函式拋出錯誤 (程式中斷了,所以永遠不會有回傳值)
  2. 無窮迴圈 (程式卡住了,永遠不會執行完)
// 這個函式執行不完,所以回傳型別是 never
function error(message: string): never {
  throw new Error(message);
}

陣列與物件

陣列 (Array)

有兩種寫法,意思完全一樣,看你喜歡哪種。

// 寫法一 (推薦,較簡潔)
let list: number[] = [1, 2, 3];

// 寫法二 (泛型寫法)
let list2: Array<number> = [1, 2, 3];

物件 (Object)

我們很少直接用 object 這個型別(因為它太籠統了,只代表「非原始型別」)。我們通常會直接定義物件的「形狀」:

// 這樣寫,user 就必須剛好有這兩個屬性,型別也要對
let user: { name: string; age: number } = {
  name: '小明',
  age: 25,
};

總結

型別意義建議用法
string, number, boolean基礎三寶最常用的型別
any放棄檢查除非逼不得已,否則別用
unknown未知型別用來處理來自 API 或外部的不確定資料
void無回傳用於函式回傳值
never不可能用於錯誤處理或完整性檢查