
上一篇的文章中,我們介紹了 TypeScript 的基本型別,如 string、number、boolean ...等。這一部分將進一步探討 TypeScript 中的物件型別,這些型別允許我們更靈活地描述和操作複雜的資料結構。
物件型別在 TypeScript 中非常重要,因為它們允許我們定義複雜的資料結構,包括陣列、函式、列舉...等。這些型別幫助我們在開發中建立更嚴謹且易於維護的程式碼。
Object 物件是一種鍵值對(key-value pairs)的集合,每個鍵(key)對應一個值(value)。
// 可以直接用 {} 方式的使用
const person1: { name: string } = {
    name: 'Johnson Mao',
};
// 也可以用 Record 的方式定義
const person2: Record<'name', string> = {
    name: 'Johnson Mao',
};
// 也可以用 type 的方式自定義型別
type Person3 = {
    name: string;
}
// 也可以用 interface 的方式自定義型別
interface Person4 {
    name: string;
}
看到這裡,你應該對 type 與 interface 定義物件的差異在哪感到好奇,這裡先賣個關子,後續介紹更多後再來說明。
Array 型別用來表示一組相同型別的元素集合。
// 可以在型別後面加上 [] 代表陣列
const stringArray1: string[] = ['1', '2', '3'];
// 也可以用 Array 的方式定義
const stringArray2: Array<string> = ['1', '2', '3'];
// 也可以用 type 的方式自定義型別
type StringArray3 = string[];
// 也可以用 interface 的方式自定義型別
interface StringArray4 {
    [index: number]: string;
}
// 如果確定陣列的長度固定型別的話,可以使用上一篇 tuple 的形式
const tuple1: [string, number] = ['one', 2];
// 如果確定陣列前面的型別,後面參數不固定數量的話
// 可以用剩餘參數的運算符收整成一個陣列
const tuple2: [string, ...number[]] = ['one', 2, 3, 4];
上一篇的文章中,在演示 void 就有稍微看到函式的寫法了,我們可以為函式定義型別,包括函式參數和返回值的型別。
// 如果參數固定的話,可以直接這樣定義參數型別
function formatCurrency(amount: number, prefix = '$'): string {
    return prefix + amount;
}
// 如果參數不固定的話,可以直接用剩餘參數的運算符收整成一個陣列
function sum(...numbers: number[]): number {
    return numbers.reduce((acc, curr) => acc + curr, 0);
}
// 也可以用 type 的方式自定義型別
type SumFn1 = (...numbers: number[]) => number;
// 也可以用 interface 的方式自定義型別
interface SumFn2 {
    (...numbers: number[]): number;
}
上一篇有稍微提到,enum(列舉型別)是一個特別的型別,用來定義一組命名常數。
這些常數可以是數字或字串,並且 enum 型別的值是唯一的,這讓代碼更具可讀性和可維護性。
// 數字型別枚舉
enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}
// 字串型別枚舉
enum Status {
    Success = 'SUCCESS',
    Error = 'ERROR',
    Pending = 'PENDING',
}
// 通常都這樣搭配以提高可讀性
function handle(direction: Direction) {
    switch (direction) {
        case Direction.Up:
            console.log('up');
            break;
        case Direction.Down:
            console.log('down');
            break;
        case Direction.Left:
            console.log('left');
            break;
        case Direction.Right:
            console.log('right');
            break;
    }
}
enum 比較特別,編譯打包時,也會跟的編譯到 JavaScript 中,犧牲一點程式碼體積,提升可讀性與維護性。
