嘿嘿!今天我們要進入 TypeScript 的奇妙世界,看看它的兩位大明星——Type 和 Interface!他們雖然長得有點像,但個性大不相同,適合不同的場景。
就像你在買東西時會選擇不同的商品一樣,在寫程式時也要選擇適合的工具。
本篇文章將帶你用簡單的步驟解開這兩者的奧秘,並順便解決常見的 TypeScript 錯誤。
讓我們一起開始吧!
type
與 interface
的比較:深入了解兩者的差異。type
,何時應該選擇 interface
。type
和 interface
在 TypeScript 中都有相同的功能,能定義物件、函數、聯合類型等,但它們在宣告上有一些微妙的差異。
Type:
type
可以定義更靈活的類型,尤其是複合類型(像是交集與聯合類型)。type Article = {
title: string;
price: number;
vat: number;
stock?: number;
description?: string;
};
Interface:
interface
更加專注於定義物件的結構,並且可以擴展(extends)其他的 interface
。type
更加適合物件導向的設計,因為它強調類別的約束性,並支援實現與擴展。interface ShopItem {
title: string;
price: number;
vat: number;
stock?: number;
description?: string;
}
Interface 的擴展(Extends)功能:
interface
支援擴展其他 interface
,這使得它在大型應用程式或物件導向的場景中非常有用。
interface PhysicalItem extends ShopItem {
weight: number;
dimensions: { length: number; width: number; height: number };
}
Type 的合併:
type
則可以通過交集(Intersection Types)來合併多個型別。這讓它可以在靈活處理多種型別時非常有用。
type DigitalItem = Article & { downloadUrl: string };
無論是 type
還是 interface
,它們都支援可選屬性 (?
),使得型別宣告更加靈活:
interface ShopItem {
title: string;
price: number;
vat: number;
stock?: number; // Optional
description?: string;
}
在使用 TypeScript 時,我們有時候會遇到一些編譯錯誤。例如,當你將一個 interface
實現到類別中時,某些必要屬性可能沒有正確實現,這會導致編譯錯誤。
讓我們看看一個簡單的錯誤:
class DVD implements ShopItem {
title: string;
price: number;
vat: number;
constructor(title: string) {
this.title = title;
this.price = 9.99;
this.vat = 0.2;
}
}
這段程式碼中,ShopItem
的 stock
屬性是可選的(?
),因此在實現 ShopItem
時,我們不需要為每個物件都提供 stock
值。然而,如果 stock
是必選項(沒有 ?
),那麼我們在類別中就必須實現這個屬性,否則會出現錯誤。
演練區
TypeScript: TS Playground - An online editor for exploring TypeScript and JavaScript
type
?何時用 interface
?type
。interface
是更好的選擇。interface
。type
。希望這篇文章讓你更清楚地理解 type
和 interface
,並幫助你解決常見的 TypeScript 錯誤。
記住,這兩者都是強大的工具,選擇適合的工具能讓你的程式碼更加精簡且易於維護!
快去實踐吧! ദ്ദി ˉ͈̀꒳ˉ͈́ )✧