在前一篇文章中,我們快速認識了如何進行型別註釋(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
)、聯合型別和交叉型別等。我們將在後續的文章中詳細介紹這些型別的使用方式。