国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 TypeScript 實(shí)用程式類型:完整指南

TypeScript 實(shí)用程式類型:完整指南

Dec 08, 2024 am 03:41 AM

TL;DR: TypeScript 公用程式類型是預(yù)先建立的函數(shù),可以轉(zhuǎn)換現(xiàn)有類型,讓您的程式碼更乾淨(jìng)且更易於維護(hù)。本文透過(guò)實(shí)際範(fàn)例解釋了基本實(shí)用程式類型,包括如何更新使用者設(shè)定檔、管理配置和安全地過(guò)濾資料。

TypeScript Utility Types: A Complete Guide

TypeScript 是現(xiàn)代 Web 開發(fā)的基石,使開發(fā)人員能夠編寫更安全、更易於維護(hù)的程式碼。透過(guò)向 JavaScript 引入靜態(tài)類型,TypeScript 有助於在編譯時(shí)捕獲錯(cuò)誤。根據(jù) 2024 年 Stack Overflow 開發(fā)者調(diào)查,TypeScript 在開發(fā)者中最受歡迎的腳本技術(shù)中排名第 5

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

本文將詳細(xì)討論實(shí)用程式類型,以幫助您掌握 TypeScript。

了解 TypeScript 實(shí)用程式類型

公用程式類型是 TypeScript 中預(yù)先定義的泛型類型,可以將現(xiàn)有型別轉(zhuǎn)換為新的變體類型。它們可以被認(rèn)為是類型級(jí)函數(shù),將現(xiàn)有類型作為參數(shù)並根據(jù)某些轉(zhuǎn)換規(guī)則傳回新類型。

這在使用介面時(shí)特別有用,因?yàn)橥ǔP枰薷囊汛嬖陬愋偷淖凅w,而實(shí)際上不需要複製類型定義。

核心實(shí)用程式類型及其實(shí)際應(yīng)用

TypeScript Utility Types: A Complete Guide

部分的

Partial 實(shí)用程式類型採(cǎi)用一個(gè)類型並使其所有屬性都是可選的。當(dāng)類型嵌套時(shí),此實(shí)用程式類型特別有價(jià)值,因?yàn)樗鼤?huì)使屬性遞歸地可選。

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

請(qǐng)參考以下程式碼範(fàn)例。

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

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

updateUser({ name: 'Alice' });

必需的

Required 實(shí)用程式類型建構(gòu)一個(gè)類型,並將所提供類型的所有屬性設(shè)為 required。這對(duì)於確保在將物件儲(chǔ)存到資料庫(kù)之前所有屬性都可用非常有用。

例如,如果在汽車註冊(cè)時(shí)使用必填,它將確保您在創(chuàng)建或保存新汽車記錄時(shí)不會(huì)錯(cuò)過(guò)任何必要的屬性,例如品牌、型號(hào)和里程。這對(duì)於資料完整性而言非常關(guān)鍵。

請(qǐng)參考以下程式碼範(fàn)例。

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

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

updateUser({ name: 'Alice' });

只讀

Readonly 實(shí)用程式類型建立一個(gè)所有屬性都是唯讀的型別。這在組態(tài)管理中非常有用,可以保護(hù)關(guān)鍵設(shè)定免受不必要的變更。

例如,當(dāng)您的應(yīng)用程式依賴特定的 API 端點(diǎn)時(shí),它們不應(yīng)在執(zhí)行過(guò)程中發(fā)生變更。將它們?cè)O(shè)為唯讀可以保證它們?cè)趹?yīng)用程式的整個(gè)生命週期中保持不變。

請(qǐng)參考以下程式碼範(fàn)例。

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

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

挑選

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

請(qǐng)參考以下程式碼範(fàn)例。

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 實(shí)用程式類型透過(guò)從現(xiàn)有型別中排除特定屬性來(lái)建構(gòu)型別。

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

請(qǐng)參考下一個(gè)程式碼範(fàn)例。

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

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

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

記錄

Record 實(shí)用程式類型會(huì)建立具有指定鍵和值的物件類型,這在處理結(jié)構(gòu)化對(duì)應(yīng)時(shí)非常有用。

例如,在庫(kù)存管理系統(tǒng)的上下文中,Record 類型可用於在項(xiàng)目和數(shù)量之間進(jìn)行明確映射。透過(guò)這種類型的結(jié)構(gòu),可以輕鬆存取和修改庫(kù)存數(shù)據(jù),同時(shí)確保所有預(yù)期的水果都得到考慮。

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

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

排除

排除**實(shí)用程式類型透過(guò)從聯(lián)合中排除特定類型來(lái)構(gòu)造類型。

在設(shè)計(jì)只接受某些原始類型(例如,數(shù)字或布林值,但不接受字串)的函數(shù)時(shí),可以使用 排除。這可以防止意外類型可能在執(zhí)行過(guò)程中導(dǎo)致錯(cuò)誤的錯(cuò)誤。

請(qǐng)參考以下程式碼範(fàn)例。

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

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

提煉

Extract 實(shí)用程式類型透過(guò)從聯(lián)合中提取特定類型來(lái)建構(gòu)類型。

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

請(qǐng)參考以下程式碼範(fàn)例。

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

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

updateUser({ name: 'Alice' });

不可為空

NonNullable 實(shí)用程式類型透過(guò)從給定類型排除 nullundefined 來(lái)建構(gòu)型別。

在需要始終定義某些值(例如使用者名稱或產(chǎn)品ID)的應(yīng)用程式中,將它們?cè)O(shè)為NonNullable 將確保此類關(guān)鍵欄位永遠(yuǎn)不會(huì)為null未定義。它在表單驗(yàn)證和 API 回應(yīng)期間非常有用,因?yàn)槿鄙僦悼赡軙?huì)導(dǎo)致問(wèn)題。

請(qǐng)參考下一個(gè)程式碼範(fàn)例。

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

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

返回類型

ReturnType 實(shí)用程式提取函數(shù)的傳回類型。

當(dāng)使用傳回複雜物件(例如座標(biāo))的高階函數(shù)或回呼時(shí),使用 ReturnType 可以簡(jiǎn)化定義預(yù)期的回傳類型,而無(wú)需每次都手動(dòng)聲明它們。這可以透過(guò)減少與類型不匹配相關(guān)的錯(cuò)誤來(lái)加快開發(fā)速度。

interface Config {
  apiEndpoint: string;
}

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

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

參數(shù)

參數(shù)實(shí)用程式將函數(shù)的參數(shù)類型提取為元組。

在想要?jiǎng)討B(tài)操作或驗(yàn)證函數(shù)參數(shù)的情況下,例如在函數(shù)周圍編寫包裝器時(shí),這可以輕鬆提取和重複使用參數(shù)類型。透過(guò)確保函數(shù)簽章的一致性,它大大提高了程式碼庫(kù)中程式碼的可重複使用性和可維護(hù)性。

請(qǐng)參考以下程式碼範(fàn)例。

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

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

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

具有實(shí)用程式類型組合的高階用例

使用 TypeScript 開發(fā)應(yīng)用程式時(shí),組合這些實(shí)用程式類型可以獲得強(qiáng)大的結(jié)果。讓我們來(lái)看看多種實(shí)用程式類型有效協(xié)同工作的一些場(chǎng)景。

結(jié)合部分和必需

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

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

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

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

建立靈活的 API 回應(yīng)

您可能想要定義根據(jù)特定條件具有不同形狀的 API 回應(yīng)。

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

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

這裡,ApiResponse 允許您為 API 呼叫建立靈活的回應(yīng)類型。透過(guò)使用 Pick ,您可以確?;貞?yīng)中僅包含相關(guān)的使用者資料。

結(jié)合排除和提取來(lái)過(guò)濾類型

您可能會(huì)遇到需要根據(jù)特定條件從聯(lián)合中過(guò)濾掉特定類型的情況。

請(qǐng)參考以下程式碼範(fàn)例。

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

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

updateUser({ name: 'Alice' });

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

最佳實(shí)踐

僅使用必要的

雖然實(shí)用程式類型非常強(qiáng)大,但過(guò)度使用它們可能會(huì)導(dǎo)致複雜且不可讀的程式碼。在利用這些實(shí)用程式和保持程式碼清晰度之間取得平衡至關(guān)重要。

請(qǐng)參考下一個(gè)程式碼範(fàn)例。

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

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

保持清晰度

確保每個(gè)實(shí)用程式用例的目的明確。避免將太多實(shí)用程式嵌套在一起,因?yàn)樗赡軙?huì)混淆類型的預(yù)期結(jié)構(gòu)。

請(qǐng)參考以下程式碼範(fàn)例。

interface Config {
  apiEndpoint: string;
}

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

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

性能考慮

雖然在執(zhí)行時(shí)間效能影響很少,因?yàn)?TypeScript 類型在編譯後消失,但複雜型別會(huì)減慢 TypeScript 編譯器的速度,影響開發(fā)速度。

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

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

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

結(jié)論

毫無(wú)疑問(wèn),TypeScript 是 Web 開發(fā)人員中最受歡迎的語(yǔ)言之一。實(shí)用程式類型是 TypeScript 中的獨(dú)特功能之一,如果正確使用,它可以顯著提高 TypeScript 開發(fā)體驗(yàn)和程式碼品質(zhì)。但是,我們不應(yīng)該在所有場(chǎng)景中都使用它們,因?yàn)榭赡軙?huì)出現(xiàn)效能和程式碼可維護(hù)性問(wèn)題。

相關(guān)部落格

  • JavaScript 和 TypeScript 的頂級(jí) Linters:簡(jiǎn)化程式碼品質(zhì)管理
  • 每個(gè)開發(fā)人員都應(yīng)該知道的 7 個(gè) JavaScript 單元測(cè)試框架
  • TypeScript 中感嘆號(hào)的使用
  • 理解 TypeScript 中的條件型別

以上是TypeScript 實(shí)用程式類型:完整指南的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無(wú)需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過(guò).write()發(fā)送POST請(qǐng)求;2.axios是基於Promise的第三方庫(kù),語(yǔ)法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用於簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語(yǔ)法簡(jiǎn)單

JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS Jul 02, 2025 am 01:28 AM

ES模塊和CommonJS的主要區(qū)別在於加載方式和使用場(chǎng)景。 1.CommonJS是同步加載,適用於Node.js服務(wù)器端環(huán)境;2.ES模塊是異步加載,適用於瀏覽器等網(wǎng)絡(luò)環(huán)境;3.語(yǔ)法上,ES模塊使用import/export,且必須位於頂層作用域,而CommonJS使用require/module.exports,可在運(yùn)行時(shí)動(dòng)態(tài)調(diào)用;4.CommonJS廣泛用於舊版Node.js及依賴它的庫(kù)如Express,ES模塊則適用於現(xiàn)代前端框架和Node.jsv14 ;5.雖然可混合使用,但容易引發(fā)問(wèn)題

垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收機(jī)制通過(guò)標(biāo)記-清除算法自動(dòng)管理內(nèi)存,以減少內(nèi)存洩漏風(fēng)險(xiǎn)。引擎從根對(duì)像出發(fā)遍歷並標(biāo)記活躍對(duì)象,未被標(biāo)記的則被視為垃圾並被清除。例如,當(dāng)對(duì)像不再被引用(如將變量設(shè)為null),它將在下一輪迴收中被釋放。常見(jiàn)的內(nèi)存洩漏原因包括:①未清除的定時(shí)器或事件監(jiān)聽器;②閉包中對(duì)外部變量的引用;③全局變量持續(xù)持有大量數(shù)據(jù)。 V8引擎通過(guò)分代回收、增量標(biāo)記、並行/並發(fā)回收等策略優(yōu)化回收效率,降低主線程阻塞時(shí)間。開發(fā)時(shí)應(yīng)避免不必要的全局引用、及時(shí)解除對(duì)象關(guān)聯(lián),以提升性能與穩(wěn)定性。

var vs Let vs const:快速JS綜述解釋器 var vs Let vs const:快速JS綜述解釋器 Jul 02, 2025 am 01:18 AM

var、let和const的區(qū)別在於作用域、提升和重複聲明。 1.var是函數(shù)作用域,存在變量提升,允許重複聲明;2.let是塊級(jí)作用域,存在暫時(shí)性死區(qū),不允許重複聲明;3.const也是塊級(jí)作用域,必須立即賦值,不可重新賦值,但可修改引用類型的內(nèi)部值。優(yōu)先使用const,需改變變量時(shí)用let,避免使用var。

為什麼DOM操縱緩慢,如何優(yōu)化? 為什麼DOM操縱緩慢,如何優(yōu)化? Jul 01, 2025 am 01:28 AM

操作DOM變慢的主要原因在於重排重繪成本高和訪問(wèn)效率低。優(yōu)化方法包括:1.減少訪問(wèn)次數(shù),緩存讀取值;2.批量處理讀寫操作;3.合併修改,使用文檔片段或隱藏元素;4.避免佈局抖動(dòng),集中處理讀寫;5.使用框架或requestAnimationFrame異步更新。

See all articles