iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
JavaScript

我推的TypeScript 操作大全系列 第 21

我推Day21 - 解鎖 TypeScript 潛力:7 大實用型別讓你程式碼飛起來!

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20241005/20124462d60D5KXUqk.jpg


掌握這 7 個型別,你就能征服一切!

當我第一次接觸到 TypeScript 時,這個語言豐富的功能遠遠超出了我的想像!
不僅僅是靜態型別的優勢,還有許多隱藏的驚喜等待著我去探索。

其中,最讓我深深著迷的,就是 TypeScript 提供的「實用型別」(Utility Types) 了。
這些內建工具就像魔法一樣,能夠大幅簡化你的程式碼,讓開發流程更有效率,還能提升程式碼的表達力。🔮

今天,我要和你分享 7 個 TypeScript 中最強大的實用型別。每位開發者都應該掌握這些工具,因為它們不僅可以提升程式碼的可讀性,還能減少潛在的錯誤,讓你的程式碼更容易維護。準備好一同探索這些小魔法了嗎?Let's go!🚀


1. Partial 🌵

Partial<T> 是處理選擇性屬性(Optional Properties)的好幫手,尤其適用於更新或修改物件時,當你不需要所有欄位都傳入時,它可以幫助你節省大量程式碼。

例子:

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

const updateTodo = (todo: Partial<Todo>) => {
  // 可以只更新部分屬性
  todo.title = "Learn TypeScript!";
};

詳細說明:

Partial<T> 會將類型 T 中的所有屬性變成可選的。這樣一來,當我們進行物件更新時,就不需要傳入所有的屬性,只需要更新想修改的那部分資料。這在處理表單更新或補丁資料(patch data)時特別有用。

優點:

  • 提高參數的靈活性,特別適合處理部分更新的情境。
  • 減少需要重複定義完整型別的麻煩,提升程式碼效率。

缺點:

  • 可能因為可選屬性過多,導致處理不完整資料時容易出現錯誤。

2. Required 🌳

Partial<T> 相反,Required<T> 可以強制所有屬性為必填,確保物件在某些情境下有完整的屬性。

例子:

interface Todo {
  title?: string;
  description?: string;
  completed?: boolean;
}

const todo: Required<Todo> = {
  title: "Finish project",
  description: "Complete TypeScript exercise",
  completed: true
};

詳細說明:

Required<T> 會將可選屬性變為必填。這在你需要確保物件遵循嚴格的格式時非常有用,例如,在處理某些應用邏輯或資料結構時,完整性至關重要。

優點:

  • 確保資料結構的完整性,防止遺漏屬性,強化型別的安全性。

缺點:

  • 如果資料結構中有自然的可選屬性,強制要求所有屬性會變得過於限制。

3. Readonly 🌿

當你不想讓物件的屬性在建立之後被更改時,Readonly<T> 是你的好朋友。

例子:

interface Todo {
  title: string;
  description: string;
}

const todo: Readonly<Todo> = {
  title: "Study TypeScript",
  description: "Learn utility types"
};

// todo.title = "Change Title"; // Error: 因為 title 是唯讀的

詳細說明:

Readonly<T> 會讓一個類型中的所有屬性變為不可變,這對於防止資料被意外修改很有幫助。常見的應用場景包括應用狀態管理,特別是在 Redux 等不可變資料結構的情境下。

優點:

  • 保證資料的不可變性,防止無意的修改。
  • 有助於維持應用程式的穩定性。

缺點:

  • 在需要更新物件屬性時無法使用。

4. Record<K, T> 🌴

Record<K, T> 是用來快速創建擁有特定鍵和值的物件類型,這在建立查找表(lookup tables)時非常實用。

例子:

interface CatInfo {
  age: number;
  breed: string;
}

type CatName = "Mittens" | "Whiskers" | "Tom";

const cats: Record<CatName, CatInfo> = {
  Mittens: { age: 5, breed: "Tabby" },
  Whiskers: { age: 6, breed: "Siamese" },
  Tom: { age: 3, breed: "Persian" }
};

詳細說明:

Record<K, T> 允許你定義具有已知鍵和對應值的物件結構。你可以使用它來創建查找表、地圖或具有特定鍵值配對的物件,讓程式碼結構更有條理。

優點:

  • 保證鍵和值的型別安全性,減少錯誤。
  • 非常適合需要快速查找某些資料的場景。

缺點:

  • 如果鍵的範圍過於嚴格,靈活性可能會降低。

5. Pick<T, K> 🌲

有時候,我們只需要一個類型中的部分屬性,這時候 Pick<T, K> 就能大展身手。

例子:

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TodoPreview = Pick<Todo, "title" | "completed">;

const todo: TodoPreview = {
  title: "Learn TypeScript",
  completed: false
};

詳細說明:

Pick<T, K> 可以從類型中選取特定的屬性,幫助你建立更專注的資料結構。這對於優化 API 回應或是想要只處理部分資料的情境特別有用。

優點:

  • 簡化類型,讓程式碼更具可讀性。
  • 增強重用性,減少冗長程式碼。

缺點:

  • 如果使用過度,可能會導致型別重複或增加維護成本。

6. Omit<T, K> 🌱

相反地,Omit<T, K> 可以用來從一個類型中移除不需要的屬性,這在某些情境下非常實用。

例子:

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TodoWithoutDescription = Omit<Todo, "description">;

const todo: TodoWithoutDescription = {
  title: "Learn TypeScript",
  completed: true
};

詳細說明:

Omit<T, K> 可以省略掉不需要的屬性,這在你需要稍微變更資料結構,或是希望在不同場景下使用略有不同的物件時非常有用。

優點:

  • 簡化複雜類型,提升可維護性。
  • 讓程式碼更具彈性和重用性。

缺點:

  • 可能會導致型別定義變得過於複雜。

7. Exclude<T, U> 🌼

最後,Exclude<T, U> 可以從聯合型別中移除某些不需要的類型。

例子:

type T = "a" | "b" | "c";
type U = "a";

type Result = Exclude<T, U>; // "b" | "c"

詳細說明:

Exclude<T, U> 允許你從聯合型別中過濾出不需要的類型,這對於你希望細緻控制型別範圍時非常有用。

優點:

  • 提供更好的型別控制,讓程式碼更加嚴謹。

缺點:

  • 使用過度可能讓型別定義變得難以維護。

小結

學會這些 TypeScript 的實用型別,真的會讓你的程式碼大變身!
不僅讓開發更順手,還能讓你的程式碼更具彈性和可維護性。🚀

別忘了,程式開發的過程中,持續學習與提升自己才是最重要的!
每一次掌握新的工具與技巧,都是讓自己邁向程式大神之路的關鍵一步。💪

所以,勇敢去運用這些強大的型別吧,讓你的程式碼閃閃發光✨,未來的你一定會感謝現在這個不斷成長的自己!

Happy coding! 💻🎉


上一篇
我推Day20 - 從零開始:搞懂 TypeScript 運算子的奧義
下一篇
我推Day22 - TypeScript 神器現身:實用型別讓你的程式碼升級成超能力
系列文
我推的TypeScript 操作大全30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言