iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
Modern Web

Hello TypeScript 菜鳥系列 第 8

Day 7. TypeScript 參考型別:Object

  • 分享至 

  • xImage
  •  

昨天稍微介紹了 Array,今天緊接著來了解同樣在JavaScript也有的 Object 型別。


Object

array 那段已經提早預告了物件(object)型別的使用方式,這裡再複述一次TypeScript的物件型別宣告和賦值方式,這裡我們宣告了一個 person 物件,而且必須包含三個屬性 - idnameisMarried

// TypeScript
let person: {
    id: number,
    name: string,
    isMarried: boolean
} = {
    id: 1,
    name: "Alice",
    isMarried:false;
};

也可以先宣告,後賦值:

// TypeScript
let person: {
    id: number,
    name: string,
    isMarried: boolean
};

person = {
    id: 1,
    name: "Alice",
    isMarried:false;
};

另外,在JavaScript裡,如果想要存取一個物件內部不存在的屬性(property)就會回傳 undefined;不過在TypeScript世界裡則是出現編譯錯誤:

// JavaScript
console.log(person.occupation);    // undefined

// TypeScript
console.log(person.occupation);    // error

到這邊可以稍微注意一下,前面建立一個 person 物件有提到「idnameisMarried是必須包含在這個物件的屬性」,有些時候某幾個屬性可能不是必要的,例如有些人不想讓其他人知道他結婚了沒,此時可以在屬性名稱後面加上一個特殊的符號 ?,讓TypeScript知道這是可有可無的屬性,同時,如果沒有對這個屬性賦值,存取這個屬性就會回傳 undefined

來稍微修改一下前面的範例:

let person: {
    id: number,
    name: string,
    isMarried?: boolean
};

person = {
    id: 1,
    name: "Alice",
};

console.log(person.isMarried);    // undefined

person 的宣告方式等價於下面兩種宣告方式:

let person: {
    id: number,
    name: string,
    isMarried?: boolean | undefined
};

// or
let person: {
    id: number,
    name: string,
    isMarried: boolean | undefined
};

前面是針對一個物件型別變數,指定物件包含的屬性、屬性型別,以及是否為非必要屬性。

假設今天要建立很多個擁有相同屬性的物件變數,像前面那樣一個變數需要個別指定一次物件型別實在是太麻煩了,也因此這裡先提前介紹一個後面章節才會說明的好東西 - interface (中文可譯作 介面接口)。

interface 可以讓開發者提前建立一個物件型別的 模板,再次將前面範例用 interface 改寫,並多建立幾個和 person 擁有相同屬性的物件變數:

interface Person {
    id: number;
    name: string;
    isMarried?: boolean;
};


let person1: People = {
    id: 1,
    name: "Alice",
}

let person2: People = {
    id: 2,
    name: "Ban",
    isMarried: true
}

let person3: People = {
    name: "Crow",        // error
    isMarried: false
}

可以看見 person1person2person3 都是指定為預先建立好、名為 Person 型別的物件變數,其中 person1 雖然沒有包含 isMarried 屬性卻也是可以的;相反地, person3 不包含 id 屬性就會出現編譯錯誤。


由以上例子能看到,對於使用 TypeScript 的開發者而言,在處理物件類型變數時,interface? 是兩個相當方便的特性,畢竟有很多資料都是以物件形式儲存,但是每一份資料的內容可能不是很完整、但卻共同擁有許多一樣的屬性,而透過這兩個特性就能讓開發變得更有彈性、更貼近真實世界的需求。

最後,再介紹一個特別的型別,{} (empty type),這個型別代表沒有屬性的空物件,雖然我還沒很清楚它的應用在,不過這個空物件型別可以透過原型鍊(prototype chain)去存取內建 Object 型別的屬性和方法,例如:

let emptyObj: {} = {};

console.log(emptyObj.toString());    // [object Objecy]


參考資料
TypeScript: JavaScript With Syntax For Types
Optional Properties
TypeScript Tutorial


上一篇
Day 6. TypeScript 參考型別:Array
下一篇
Day 8. TypeScript 參考型別:Tuple
系列文
Hello TypeScript 菜鳥31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言