在前一篇文章中,我們快速認識了如何進行型別註釋(Type Annotations),並介紹了型別中最基礎的原始資料型別。接下來將學習物件型別,這是開發中經常使用且較為複雜的型別之一。
在開始前,也讓我們再次複習一下型別註釋的理解圖吧!
在 TypeScript 中,任何非原始型別的值都會被歸類為物件型別。然而,object 和 Object 在 TypeScript 中是不同的概念:
object(小寫開頭):是 TypeScript 中的一個型別,它表示非原始型別(non-primitive types),這意味著它只能接受物件型別的值,如物件({})、陣列([])、函式(function)等。不能將原始型別(如 number、string、boolean 等)賦值給 object 型別。如果只想限制為物件型別,應該使用 object。
let obj: object;
obj = { key: 'value' };  // ok
obj = [9, 1, 7];         // ok
obj = function() {};     // ok
obj = 18;       // 錯誤:Type 'number' is not assignable to type 'object'.
obj = "ithelp";  // 錯誤:Type 'string' is not assignable to type 'object'.
Object(大寫開頭):是 JavaScript 中所有物件的內建類別(built-in class),所有物件都繼承自 Object。因此,Object 可以接受所有型別,包括原始型別和物件型別。換句話說,所有的值在 JavaScript 中都是 Object 的實例,因為所有的物件都繼承了 Object.prototype。如果可以允許變數接受任何型別,則使用 Object 或直接使用更廣泛的 any 或 unknown。
let obj: Object;
obj = { key: 'value' };  // ok
obj = [9, 1, 7];         // ok
obj = function() {};     // ok
obj = 18;                // ok
obj = "ithelp";           // ok
下面是一些範例,展示如何在 TypeScript 中使用 object 型別。
object:let employee: object = {};
employee = {
    firstName: 'Annie',
    age: 18,
    jobTitle: 'Web Developer'
};
console.log(employee);
// {
//   firstName: 'Annie',
//   age: 18,
//   jobTitle: 'Web Developer'
// }
// Type '{ firstName: string; age: number; jobTitle: string }' is not assignable to type 
let employee: {
    firstName: string;
    age: number;
    jobTitle: string;
};
{} 定義型別,讓語法更簡潔。const employee: {
    firstName: string;
    age: number;
    jobTitle: string;
} = {
    firstName: 'Annie',
    age: 18,
    jobTitle: 'Web Developer'
};
employee = "Tina";
// Type '"Tina"' is not assignable to type 'object'.
console.log(employee.lastName);
// Property 'lastName' does not exist on type 'object'.
object// 方法1
employee = {
    firstName: 'Annie',
    lastName: 'Lin',
    age: 18,
    jobTitle: 'Web Developer'
};
// 方法2
let employee: {
    firstName: string;
    lastName: string;
    age: number;
    jobTitle: string;
} = {
    firstName: 'Annie',
    lastName: 'Lin',
    age: 18,
    jobTitle: 'Web Developer'
};
console.log(employee);
// {
//   firstName: 'Annie',
//   lastName: 'Lin',
//   age: 18,
//   jobTitle: 'Web Developer'
// }
?)來實現的。例如,假設我們希望 startDate 是一個可選屬性let employee: {
    firstName: string;
    lastName: string;
    age: number;
    jobTitle: string;
    startDate?: Date; // 可選屬性
} = {
    firstName: 'Annie',
    lastName: 'Lin',
    age: 18,
    jobTitle: 'Web Developer'
};
startDate 是可選的,因此在初始化物件時可以選擇不包含該屬性。當需要指定 startDate 時,可以這樣使用employee.startDate = new Date(); // 加上 startDate 屬性
以上是 TypeScript 中物件型別的基本使用方法。在實際開發中,物件型別比原始型別更為複雜且靈活。此外,TypeScript 也支持更多進階的型別系統,例如物件型別的擴展(如 interface)、特殊型別(如 any、unknown)、聯合型別和交叉型別等。我們將在後續的文章中詳細介紹這些型別的使用方式。