首頁 web前端 js教程 TypeScript 實用程式類型:完整指南

TypeScript 實用程式類型:完整指南

Dec 08, 2024 am 03:41 AM

TL;DR: TypeScript 公用程式類型是預先建立的函數,可以轉換現有類型,讓您的程式碼更乾淨且更易於維護。本文透過實際範例解釋了基本實用程式類型,包括如何更新使用者設定檔、管理配置和安全地過濾資料。

TypeScript Utility Types: A Complete Guide

TypeScript 是現代 Web 開發的基石,使開發人員能夠編寫更安全、更易於維護的程式碼。透過向 JavaScript 引入靜態類型,TypeScript 有助於在編譯時捕獲錯誤。根據 2024 年 Stack Overflow 開發者調查,TypeScript 在開發者中最受歡迎的腳本技術中排名第 5

TypeScript 令人驚嘆的功能是其成功的主要原因。例如,實用程式類型可以幫助開發人員簡化類型操作並減少樣板程式碼。 TypeScript 2.1 中引入了實用程式類型,並且在每個新版本中都新增了其他實用程式類型。

本文將詳細討論實用程式類型,以幫助您掌握 TypeScript。

了解 TypeScript 實用程式類型

公用程式類型是 TypeScript 中預先定義的泛型類型,可以將現有型別轉換為新的變體類型。它們可以被認為是類型級函數,將現有類型作為參數並根據某些轉換規則傳回新類型。

這在使用介面時特別有用,因為通常需要修改已存在類型的變體,而實際上不需要複製類型定義。

核心實用程式類型及其實際應用

TypeScript Utility Types: A Complete Guide

部分的

Partial 實用程式類型採用一個類型並使其所有屬性都是可選的。當類型嵌套時,此實用程式類型特別有價值,因為它會使屬性遞歸地可選。

例如,假設您正在建立一個使用者設定檔更新功能。在這種情況下,如果使用者不想更新所有字段,則可以只使用 Partial 類型,只更新所需的字段。這在不需要所有欄位的表單和 API 中非常方便。

請參考以下程式碼範例。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

登入後複製
登入後複製
登入後複製
登入後複製

必需的

Required 實用程式類型建構一個類型,並將所提供類型的所有屬性設為 required。這對於確保在將物件儲存到資料庫之前所有屬性都可用非常有用。

例如,如果在汽車註冊時使用必填,它將確保您在創建或保存新汽車記錄時不會錯過任何必要的屬性,例如品牌、型號和里程。這對於資料完整性而言非常關鍵。

請參考以下程式碼範例。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

登入後複製
登入後複製
登入後複製
登入後複製

只讀

Readonly 實用程式類型建立一個所有屬性都是唯讀的型別。這在組態管理中非常有用,可以保護關鍵設定免受不必要的變更。

例如,當您的應用程式依賴特定的 API 端點時,它們不應在執行過程中發生變更。將它們設為唯讀可以保證它們在應用程式的整個生命週期中保持不變。

請參考以下程式碼範例。

interface Car {
  make: string;
  model: string;
  mileage?: number;
}

const myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000,
};

登入後複製
登入後複製
登入後複製

挑選

Pick** 實用程式類型透過從現有型別中選取一組屬性來建構型別。當您需要過濾掉重要資訊(例如使用者姓名和電子郵件)以顯示在儀表板或摘要檢視中時,這非常有用。它有助於提高資料的安全性和清晰度。

請參考以下程式碼範例。

interface Config {
  apiEndpoint: string;
}

const config: Readonly<Config> = { apiEndpoint: 'https://api.example.com' };

// config.apiEndpoint = 'https://another-url.com'; // Error: Cannot assign to 'apiEndpoint'

登入後複製
登入後複製
登入後複製

忽略

Omit 實用程式類型透過從現有型別中排除特定屬性來建構型別。

例如,如果您想與某些第三方共享使用者資料但沒有敏感資訊(例如電子郵件地址),省略將很有用。您可以透過定義一個排除這些欄位的新類型來做到這一點。特別是在 API 中,您可能想要查看 API 回應中的外部內容。

請參考下一個程式碼範例。

interface User {
  id: number;
  name: string;
  email: string;
}

type UserSummary = Pick<User, 'name' | 'email'>;

const userSummary: UserSummary = {
  name: 'Alice',
  email: 'alice@example.com',
};

登入後複製
登入後複製
登入後複製

記錄

Record 實用程式類型會建立具有指定鍵和值的物件類型,這在處理結構化對應時非常有用。

例如,在庫存管理系統的上下文中,Record 類型可用於在項目和數量之間進行明確映射。透過這種類型的結構,可以輕鬆存取和修改庫存數據,同時確保所有預期的水果都得到考慮。

interface User {
  id: number;
  name: string;
  email?: string;
}

const userWithoutEmail: Omit<User, 'email'> = {
  id: 1,
  name: 'Bob',
};

登入後複製
登入後複製

排除

排除**實用程式類型透過從聯合中排除特定類型來構造類型。

在設計只接受某些原始類型(例如,數字或布林值,但不接受字串)的函數時,可以使用 排除。這可以防止意外類型可能在執行過程中導致錯誤的錯誤。

請參考以下程式碼範例。

type Fruit = 'apple' | 'banana' | 'orange';
type Inventory = Record<Fruit, number>;

const inventory: Inventory = {
  apple: 10,
  banana: 5,
  orange: 0,
};

登入後複製
登入後複製

提煉

Extract 實用程式類型透過從聯合中提取特定類型來建構類型。

在只需要處理混合類型集合中的數值(例如執行計算)的情況下,使用 Extract 可確保僅傳遞數字。這在資料處理管道中非常有用,其中嚴格的類型可以防止運行時錯誤。

請參考以下程式碼範例。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

登入後複製
登入後複製
登入後複製
登入後複製

不可為空

NonNullable 實用程式類型透過從給定類型排除 nullundefined 來建構型別。

在需要始終定義某些值(例如使用者名稱或產品ID)的應用程式中,將它們設為NonNullable 將確保此類關鍵欄位永遠不會為null未定義。它在表單驗證和 API 回應期間非常有用,因為缺少值可能會導致問題。

請參考下一個程式碼範例。

interface Car {
  make: string;
  model: string;
  mileage?: number;
}

const myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000,
};

登入後複製
登入後複製
登入後複製

返回類型

ReturnType 實用程式提取函數的傳回類型。

當使用傳回複雜物件(例如座標)的高階函數或回呼時,使用 ReturnType 可以簡化定義預期的回傳類型,而無需每次都手動聲明它們。這可以透過減少與類型不匹配相關的錯誤來加快開發速度。

interface Config {
  apiEndpoint: string;
}

const config: Readonly<Config> = { apiEndpoint: 'https://api.example.com' };

// config.apiEndpoint = 'https://another-url.com'; // Error: Cannot assign to 'apiEndpoint'

登入後複製
登入後複製
登入後複製

參數

參數實用程式將函數的參數類型提取為元組。

在想要動態操作或驗證函數參數的情況下,例如在函數周圍編寫包裝器時,這可以輕鬆提取和重複使用參數類型。透過確保函數簽章的一致性,它大大提高了程式碼庫中程式碼的可重複使用性和可維護性。

請參考以下程式碼範例。

interface User {
  id: number;
  name: string;
  email: string;
}

type UserSummary = Pick<User, 'name' | 'email'>;

const userSummary: UserSummary = {
  name: 'Alice',
  email: 'alice@example.com',
};

登入後複製
登入後複製
登入後複製

具有實用程式類型組合的高階用例

使用 TypeScript 開發應用程式時,組合這些實用程式類型可以獲得強大的結果。讓我們來看看多種實用程式類型有效協同工作的一些場景。

結合部分和必需

您可以建立一個需要某些欄位而允許其他欄位可選的類型。

interface User {
  id: number;
  name: string;
  email?: string;
}

const userWithoutEmail: Omit<User, 'email'> = {
  id: 1,
  name: 'Bob',
};

登入後複製
登入後複製

在此範例中,UpdateUser 需要 id 屬性,同時允許名稱和電子郵件為可選。此模式對於更新標識符必須始終存在的記錄非常有用。

建立靈活的 API 回應

您可能想要定義根據特定條件具有不同形狀的 API 回應。

type Fruit = 'apple' | 'banana' | 'orange';
type Inventory = Record<Fruit, number>;

const inventory: Inventory = {
  apple: 10,
  banana: 5,
  orange: 0,
};

登入後複製
登入後複製

這裡,ApiResponse 允許您為 API 呼叫建立靈活的回應類型。透過使用 Pick ,您可以確保回應中僅包含相關的使用者資料。

結合排除和提取來過濾類型

您可能會遇到需要根據特定條件從聯合中過濾掉特定類型的情況。

請參考以下程式碼範例。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

登入後複製
登入後複製
登入後複製
登入後複製

這裡,Exclude 實用程式用於建立一個型別( NonLoadingResponses ),從原始ResponseTypes 聯合中排除loading handleResponse函數只接受成功錯誤作為有效輸入。

最佳實踐

僅使用必要的

雖然實用程式類型非常強大,但過度使用它們可能會導致複雜且不可讀的程式碼。在利用這些實用程式和保持程式碼清晰度之間取得平衡至關重要。

請參考下一個程式碼範例。

interface Car {
  make: string;
  model: string;
  mileage?: number;
}

const myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000,
};

登入後複製
登入後複製
登入後複製

保持清晰度

確保每個實用程式用例的目的明確。避免將太多實用程式嵌套在一起,因為它可能會混淆類型的預期結構。

請參考以下程式碼範例。

interface Config {
  apiEndpoint: string;
}

const config: Readonly<Config> = { apiEndpoint: 'https://api.example.com' };

// config.apiEndpoint = 'https://another-url.com'; // Error: Cannot assign to 'apiEndpoint'

登入後複製
登入後複製
登入後複製

性能考慮

雖然在執行時間效能影響很少,因為 TypeScript 類型在編譯後消失,但複雜型別會減慢 TypeScript 編譯器的速度,影響開發速度。

interface User {
  id: number;
  name: string;
  email: string;
}

type UserSummary = Pick<User, 'name' | 'email'>;

const userSummary: UserSummary = {
  name: 'Alice',
  email: 'alice@example.com',
};

登入後複製
登入後複製
登入後複製

結論

毫無疑問,TypeScript 是 Web 開發人員中最受歡迎的語言之一。實用程式類型是 TypeScript 中的獨特功能之一,如果正確使用,它可以顯著提高 TypeScript 開發體驗和程式碼品質。但是,我們不應該在所有場景中都使用它們,因為可能會出現效能和程式碼可維護性問題。

相關部落格

  • JavaScript 和 TypeScript 的頂級 Linters:簡化程式碼品質管理
  • 每個開發人員都應該知道的 7 個 JavaScript 單元測試框架
  • TypeScript 中感嘆號的使用
  • 理解 TypeScript 中的條件型別

以上是TypeScript 實用程式類型:完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

Zustand異步操作:如何確保useStore獲取的最新狀態? Zustand異步操作:如何確保useStore獲取的最新狀態? Apr 04, 2025 pm 02:09 PM

zustand異步操作中的數據更新問題在使用zustand狀態管理庫時,經常會遇到異步操作導致數據更新不及時的問題。 �...

See all articles