TS常見內置映射類型的實現及應用場景

以下是 TypeScript 在前端項目中?常用的映射類型(Mapped Types),結合具體場景和代碼示例,幫助開發者高效處理復雜類型:


一、基礎映射類型

1.?Partial<T>

作用:將對象類型?T?的所有屬性變為可選。
實現

type Partial<T> = {[P in keyof T]?: T[P];
};

應用場景

  • 表單的初始狀態(部分字段可選)。

  • API 請求的更新參數(只需傳部分字段)。

interface User {name: string;age: number;
}type PartialUser = Partial<User>;
// { name?: string; age?: number }const initialForm: PartialUser = {}; // 合法

2.?Required<T>

作用:將對象類型?T?的所有屬性變為必填。
實現

type Required<T> = {[P in keyof T]-?: T[P]; // "-?" 表示移除可選修飾符
};

應用場景

  • 嚴格校驗配置對象(確保所有字段必須存在)。

type StrictConfig = Required<{ apiUrl?: string }>;
// { apiUrl: string }const config: StrictConfig = { apiUrl: "https://api.com" }; // 必須填寫

3.?Readonly<T>

作用:將對象類型?T?的所有屬性變為只讀。
實現

type Readonly<T> = {readonly [P in keyof T]: T[P];
};

應用場景

  • 全局常量配置(防止意外修改)。

  • React 組件的默認 Props。

const defaultProps: Readonly<{ color: string }> = { color: "red" };
defaultProps.color = "blue"; // 編譯報錯:只讀屬性

4.?Pick<T, K>

作用:從對象類型?T?中選取指定鍵?K?的子集。
實現

type Pick<T, K extends keyof T> = {[P in K]: T[P];
};

應用場景

  • 組件 Props 的透傳(如僅暴露部分屬性)。

  • 過濾敏感字段(如排除?password)。

interface User {id: string;name: string;password: string;
}type SafeUser = Pick<User, "id" | "name">;
// { id: string; name: string }

5.?Omit<T, K>

作用:從對象類型?T?中排除指定鍵?K?的屬性。
實現

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

應用場景

  • 覆蓋組件默認 Props。

  • 忽略不需要的 API 響應字段。

type UserWithoutPassword = Omit<User, "password">;
// { id: string; name: string }

6.?Record<K, T>

作用:創建一個鍵類型為?K,值類型為?T?的對象類型。
實現

type Record<K extends keyof any, T> = {[P in K]: T;
};

應用場景

  • 枚舉映射(如國際化詞表)。

  • Redux 的 Action 類型集合。

type Language = "en" | "zh";
type I18N = Record<Language, { title: string }>;const i18n: I18N = {en: { title: "Hello" },zh: { title: "你好" },
};

二、進階映射類型

1.?條件映射:{ [K in keyof T]: T[K] extends U ? X : Y }

作用:根據條件篩選或轉換屬性類型。
應用場景

  • 提取所有函數屬性。

  • 將數字屬性轉為字符串。

type FunctionKeys<T> = {[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T]; // 最終得到聯合類型type UserMethods = FunctionKeys<User>; // "update" | "delete"

2.?深度映射:DeepReadonly?/?DeepPartial

作用:遞歸處理嵌套對象屬性。
實現

type DeepReadonly<T> = {readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};type DeepPartial<T> = {[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};

應用場景

  • 深度凍結狀態(如 Redux 的不可變狀態樹)。

  • 表單的嵌套字段可選。

interface NestedData {user: { name: string; address: { city: string } };
}type ReadonlyData = DeepReadonly<NestedData>;
// user 和 address 均為只讀

3.?聯合類型映射:{ [K in keyof T]: T[K] }

作用:將聯合類型轉為交叉類型或其他結構。
應用場景

  • 合并多個接口類型。

type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;type Combined = UnionToIntersection<{ a: 1 } | { b: 2 }>;
// { a: 1 } & { b: 2 }

三、前端實戰場景

場景 1:動態表單控件 Props

根據表單字段類型生成對應的 UI 控件 Props。

type FieldType = "text" | "number" | "date";type FieldProps<T extends FieldType> = {type: T;value: T extends "text" ? string :T extends "number" ? number :Date;
};function renderField<T extends FieldType>(props: FieldProps<T>) {// 根據 type 渲染不同控件
}

場景 2:Redux Action 類型安全

自動推導 Action 類型,避免手動定義。

type ActionMap<M extends { [key: string]: any }> = {[Key in keyof M]: M[Key] extends undefined? { type: Key }: { type: Key; payload: M[Key] };
};type Actions = ActionMap<{LOGIN: { username: string };LOGOUT: undefined;
}>;// 結果:
// { LOGIN: { type: "LOGIN"; payload: { username: string } }, 
//   LOGOUT: { type: "LOGOUT" } }

場景 3:組件 Props 動態擴展

通過映射類型動態生成復合 Props。

type WithClassName<T> = T & { className?: string };type ButtonProps = WithClassName<{onClick: () => void;text: string;
}>;// 結果:{ onClick: () => void; text: string; className?: string }

四、總結

映射類型核心能力典型場景
Partial<T>屬性可選化表單初始值、更新參數
Pick<T, K>?/?Omit<T, K>屬性篩選或排除組件 Props 透傳
Record<K, T>鍵值對批量定義枚舉映射、Action 集合
條件映射按條件轉換屬性類型動態表單控件
深度映射遞歸處理嵌套對象不可變狀態、復雜表單

掌握這些映射類型后,可以大幅減少重復代碼,提升前端項目的類型安全性和可維護性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72515.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

介紹如何使用YOLOv8模型進行基于深度學習的吸煙行為檢測

下面為你詳細介紹如何使用YOLOv8模型進行基于深度學習的吸煙行為檢測&#xff0c;包含環境配置、數據準備、模型訓練以及推理等步驟。 1. 環境配置 首先&#xff0c;你需要安裝必要的庫&#xff0c;主要是ultralytics庫&#xff0c;它包含了YOLOv8模型。你可以使用以下命令進…

AI-醫學影像分割方法與流程

AI醫學影像分割方法與流程–基于低場磁共振影像的病灶識別 – 作者:coder_fang AI框架&#xff1a;PaddleSeg 數據準備&#xff0c;使用MedicalLabelMe進行dcm文件標注&#xff0c;產生同名.json文件。 編寫程序生成訓練集圖片&#xff0c;包括掩碼圖。 代碼如下: def doC…

【Python】09、字典

文章目錄 1. 字典簡介2. 字典的使用2.1 字典創建2.2 字典值獲取2.3 字典值修改2.4 字典的刪除 3. 字典的遍歷 1. 字典簡介 字典(dict)屬于一種新的數據結構&#xff0c;稱為映射(mapping)。 字典的作用和列表類似&#xff0c;但是查詢性能比列表好&#xff1b;在字典中每個元…

【貪心算法4】

力扣452.用最少數量的剪引爆氣球 鏈接: link 思路 這道題的第一想法就是如果氣球重疊得越多那么用箭越少&#xff0c;所以先將氣球按照開始坐標從小到大排序&#xff0c;遇到有重疊的氣球&#xff0c;在重疊區域右邊界最小值之前的區域一定需要一支箭&#xff0c;這道題有兩…

SGMEA: Structure-Guided Multimodal Entity Alignment

3 Method 3.1 Problem Definition 3.2 Framework Description 總體框架如圖2所示&#xff0c;由三個主要部分組成&#xff1a;初始嵌入采集模塊、結構引導模塊和模態融合模塊。 3.3 Initial Embedding Acquisition 3.3.1 Structural Embedding 3.3.2 Relation, Attribute, …

KY-038 聲音傳感器如何工作以及如何將其與 ESP32 連接

想為您的項目賦予聲音感!然后跟著做,因為在這個項目中,我們將連接一個聲音傳感器,用它構建一些有趣的項目。我們使用的 KY-038 聲音傳感器使用電容式麥克風來檢測聲波,這為我們提供了穩定性和可靠性的完美平衡。因此,在本文中,我們決定將 KY-038 傳感器與 ESP32 連接,并…

《基于超高頻RFID的圖書館管理系統的設計與實現》開題報告

一、研究背景與意義 1.研究背景 隨著信息化時代的到來&#xff0c;運用計算機科學技術實現圖書館的管理工作已成為優勢。更加科學地管理圖書館會大大提高工作效率。我國的圖書管理體系發展經歷了三個階段&#xff1a;傳統圖書管理模式、現代圖書管理模式以及基于無線射頻識別&…

[local-file-system]基于服務器磁盤的本地文件存儲方案

[local-file-system]基于服務器磁盤的本地文件存儲方案 僅提供后端方案 github 環境 JDK11linux/windows/mac 應用場景 適用于ToB業務&#xff0c;中小企業的單體服務&#xff0c;僅使用磁盤存儲文件的解決方案 僅使用服務器磁盤存儲 與業務實體相結合的文件存儲方案&…

P5708 【深基2.習2】三角形面積(洛谷—python)

題目描述 一個三角形的三邊長分別是 a、b、c&#xff0c;那么它的面積為 p(p?a)(p?b)(p?c)?&#xff0c;其中 p21?(abc)。輸入這三個數字&#xff0c;計算三角形的面積&#xff0c;四舍五入精確到 1 位小數。 輸入格式 第一行輸入三個實數 a,b,c&#xff0c;以空格隔開…

智慧加油站小程序數據庫設計文檔

智慧加油站系統 - 數據庫與API設計文檔 1. 數據庫設計 1.1 ER模型 系統的核心實體關系如下&#xff1a; 用戶(User) ---< 訂單(Order) ---< 加油記錄(RefuelRecord)| | || | vv v …

C++博客分享

本周的一些 C視頻分享, 或許后續會做一些內容總結. 博客 Polymorphic, Defaulted EqualityConstexpr factors_ofC26: Removing language featuresBypassing the branch predictor Meeting C 2024 Clean CMake for C (library) developers - Kerstin KellerAn Introduction …

【藍橋杯每日一題】3.16

&#x1f3dd;?專欄&#xff1a; 【藍橋杯備篇】 &#x1f305;主頁&#xff1a; f狐o貍x 目錄 3.9 高精度算法 一、高精度加法 題目鏈接&#xff1a; 題目描述&#xff1a; 解題思路&#xff1a; 解題代碼&#xff1a; 二、高精度減法 題目鏈接&#xff1a; 題目描述&…

vue 仿deepseek前端開發一個對話界面

后端&#xff1a;調用deepseek的api&#xff0c;所以返回數據格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…

SpringMVC(五)攔截器

目錄 攔截器基本概念 一 單個攔截器的執行 1 創建攔截器 2 SpringMVC配置&#xff0c;并指定攔截路徑。 3 運行結果展示&#xff1a; 二 多個攔截器的執行順序 三 攔截器與過濾器的區別 攔截器基本概念 SpringMVC內置攔截器機制&#xff0c;允許在請求被目標方法處理的…

Hive SQL 精進系列:PERCENTILE_APPROX 搞定分位數

目錄 一、引言二、percentile_approx 函數基礎2.1 基本語法參數解釋返回值簡單示例 三、應用場景3.1 數據分析與報告3.2 數據清洗與異常值檢測3.3 性能監控與優化 四、使用注意事項4.1 數據類型要求4.2 精度與性能平衡4.3 空值處理 五、總結 一、引言 百分位數作為一種常用的統…

pytorch快速入門——手寫數字分類GPU加速

&#x1f451;主頁&#xff1a;吾名招財 &#x1f453;簡介&#xff1a;工科學碩&#xff0c;研究方向機器視覺&#xff0c;愛好較廣泛… ?&#x1f4ab;簽名&#xff1a;面朝大海&#xff0c;春暖花開&#xff01; pytorch快速入門——手寫數字分類GPU加速 一、tensor1&#…

【開源免費】基于SpringBoot+Vue.JS電商應用系統(JAVA畢業設計)

本文項目編號 T 242 &#xff0c;文末自助獲取源碼 \color{red}{T242&#xff0c;文末自助獲取源碼} T242&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

經歷過的IDEA+Maven+JDK一些困惑

注意事項&#xff1a;由于使用過程中是IDEA綁定好另外2個工具&#xff0c;所以報錯統一都顯示在控制臺&#xff0c;但要思考和分辨到底是IDEA本身問題導致的報錯&#xff0c;還是maven導致的 使用前的配置 編輯期 定義&#xff1a;指的是從open projects開始&#xff0c;到執行…

【推理】大模型ReasonGraph:推理路徑的可視化論文及代碼分析

ReasonGraph:推理路徑的可視化 ReasonGraph demo http://192.168.50.197:5001/ 作者的其他論文 ** ** LLM推理方法的相關工作

學習路之TP6 --重寫vendor目錄下的文件(服務覆蓋command---優點:命令前后一致)

學習路之TP6 --重寫vendor目錄下的文件 一、新建命令文件&#xff1a;二、復制修改&#xff1a;Server.php三、新建服務類&#xff1a;WorkmanService.php四、注冊服務五、運行效果 有需求要重寫vendor\topthink\think-worker\src\command\Server.php 以實現修改代碼 一、新建命…