最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript高級(jí)類型Record、Partial、Omit實(shí)戰(zhàn)

 更新時(shí)間:2026年05月27日 09:28:40   作者:coding隨想  
本文主要介紹了TypeScript高級(jí)類型Record、Partial、Omit實(shí)戰(zhàn),能讓你的代碼更簡潔、安全,甚至構(gòu)建出更靈活的DSL,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在TypeScript項(xiàng)目中,你是否常被對(duì)象類型定義的重復(fù)和冗余困擾?當(dāng)處理表單、API響應(yīng)或狀態(tài)管理時(shí),手動(dòng)維護(hù)類型不僅耗時(shí),還容易引入錯(cuò)誤。掌握Record、Partial和Omit這些內(nèi)置高級(jí)類型,能讓你的代碼更簡潔、安全,甚至構(gòu)建出更靈活的DSL(領(lǐng)域特定語言)。本文通過最小可運(yùn)行示例和真實(shí)場景,直擊核心用法,拒絕空泛說教。

一、基本概念與定義

這些類型是TypeScript內(nèi)置的映射類型(Mapped Types),用于動(dòng)態(tài)轉(zhuǎn)換對(duì)象類型。核心作用:避免重復(fù)定義,提升類型安全性。

術(shù)語英文作用適用場景
RecordRecord<Keys, Type>創(chuàng)建鍵為Keys、值為Type的映射對(duì)象動(dòng)態(tài)鍵值對(duì)(如狀態(tài)管理)
PartialPartial<Type>使Type所有屬性變?yōu)榭蛇x部分更新(如表單、API PATCH)
OmitOmit<Type, Keys>從Type中移除指定鍵(屬性)API響應(yīng)脫敏、字段過濾

? 關(guān)鍵提示:Omit 從TypeScript 3.5+開始支持(需配置tsconfig.json的target ≥ ES2019)。

二、關(guān)鍵語法點(diǎn):最小示例與邊界情況

1.Record:動(dòng)態(tài)鍵值對(duì)

// 定義基礎(chǔ)類型
interface User { id: number; name: string; age: number }

// 創(chuàng)建映射對(duì)象:所有鍵為字符串,值為User
type UserRecord = Record<string, User>;

// 使用示例
const userMap: UserRecord = {
  "user-1": { id: 1, name: "Alice", age: 25 },
  "user-2": { id: 2, name: "Bob", age: 30 }
};

// 邊界情況:鍵不存在時(shí),類型會(huì)報(bào)錯(cuò)(編譯時(shí)檢查)
const invalidKey = userMap["user-3"]; // ? 編譯通過(類型為User | undefined)
const invalidValue = { id: 3, name: "Charlie" }; 
userMap["user-3"] = invalidValue; // ? 類型錯(cuò)誤:對(duì)象缺少`age`屬性

2.Partial:使屬性可選

// 從User創(chuàng)建可選類型
type PartialUser = Partial<User>;

// 使用示例:部分更新
const updateUser = (id: number, updates: PartialUser) => {
  const user = { id, ...updates }; // ? 編譯通過
  return user;
};

// 邊界情況:訪問可選屬性需檢查
const user = updateUser(1, { name: "Alice" });
console.log(user.name); // ? 無錯(cuò)誤(name可選)
console.log(user.age);  // ? 編譯錯(cuò)誤:屬性'age'可能為undefined

3.Omit:移除指定屬性

// 從User移除age屬性
type UserWithoutAge = Omit<User, "age">;

// 使用示例:API響應(yīng)脫敏
const apiResponse: User = { id: 1, name: "Alice", age: 25 };
const publicResponse: UserWithoutAge = Omit(apiResponse, "age"); // ? 錯(cuò)誤:Omit是類型,不是函數(shù)

// 正確用法:類型轉(zhuǎn)換
const publicResponse: UserWithoutAge = {
  id: apiResponse.id,
  name: apiResponse.name
};

// 邊界情況:移除不存在的鍵
type InvalidOmit = Omit<User, "email">; // ? 編譯通過(email不在User中,無影響)

?? 重要區(qū)別Omit類型操作符,不是函數(shù)。錯(cuò)誤寫法Omit(apiResponse, "age")會(huì)觸發(fā)類型錯(cuò)誤。

三、工作原理:映射類型的本質(zhì)

TypeScript的高級(jí)類型本質(zhì)是編譯時(shí)的類型轉(zhuǎn)換,通過映射in)實(shí)現(xiàn):

// 內(nèi)部實(shí)現(xiàn)簡化版(非真實(shí)代碼)
type Partial<Type> = {
  [P in keyof Type]?: Type[P];
};

type Omit<Type, Keys extends keyof Type> = {
  [P in keyof Type as Exclude<P, Keys>]: Type[P];
};
  • Partial:遍歷所有屬性P,將類型設(shè)為Type[P] | undefined。
  • Omit:遍歷所有屬性P,排除Keys指定的屬性(Exclude<P, Keys>)。

?? 優(yōu)勢:類型轉(zhuǎn)換在編譯階段完成,運(yùn)行時(shí)零開銷。

四、實(shí)戰(zhàn)場景:真實(shí)開發(fā)中的正確用法

場景1:表單狀態(tài)管理(避免重復(fù)類型)

問題:手動(dòng)定義部分表單類型導(dǎo)致冗余。

// 錯(cuò)誤用法:重復(fù)定義
interface LoginForm {
  email: string;
  password: string;
}

type PartialLoginForm = {
  email?: string;
  password?: string;
};

// 正確用法:直接使用Partial
type PartialLoginForm = Partial<LoginForm>;

為什么更好?

  • 無需手動(dòng)維護(hù)PartialLoginForm。
  • 當(dāng)LoginForm新增字段(如username),PartialLoginForm自動(dòng)同步。
  • ? 安全:編譯時(shí)檢查email是否為字符串。

場景2:API響應(yīng)過濾(脫敏與簡化)

問題:手動(dòng)創(chuàng)建新類型導(dǎo)致維護(hù)成本高。

// 錯(cuò)誤用法:冗余類型
interface UserResponse {
  id: number;
  name: string;
  createdAt: Date;
  updatedAt: Date;
}

type PublicUser = {
  id: number;
  name: string;
};

// 正確用法:使用Omit
type PublicUser = Omit<UserResponse, "createdAt" | "updatedAt">;

為什么更好?

  • PublicUser自動(dòng)排除敏感字段(createdAt/updatedAt)。
  • 當(dāng)UserResponse新增字段(如bio),PublicUser無需修改。
  • ? 高效:減少類型定義量,提升可維護(hù)性。

五、應(yīng)用場景與最佳實(shí)踐

場景推薦類型為什么
部分更新API數(shù)據(jù)(PATCH)Partial避免強(qiáng)制提供所有字段
表單狀態(tài)(React/Vue)Partial僅需傳遞修改的字段
API響應(yīng)脫敏(暴露給前端)Omit過濾敏感字段(如時(shí)間戳)
動(dòng)態(tài)配置對(duì)象(如i18n)Record鍵為語言代碼,值為翻譯內(nèi)容
狀態(tài)管理(Redux)Record狀態(tài)鍵動(dòng)態(tài)生成

?? 最佳實(shí)踐:

  • 優(yōu)先用內(nèi)置類型,避免手寫映射類型。
  • 用as強(qiáng)制轉(zhuǎn)換時(shí)需謹(jǐn)慎(如Omit需配合類型斷言,但應(yīng)盡量避免)。

六、常見坑與排錯(cuò)建議

坑1:Omit中指定不存在的鍵

type SafeOmit = Omit<User, "email">; // ? 無錯(cuò)誤(email不在User中)
type InvalidOmit = Omit<User, "phone">; // ? 無報(bào)錯(cuò)(但phone未定義,可能邏輯錯(cuò)誤)

? 排錯(cuò):確保移除的鍵在原始類型中存在。使用IDE檢查(如VSCode的類型提示)。

坑2:Partial導(dǎo)致屬性缺失

const user: Partial<User> = { id: 1 };
console.log(user.name); // ? 編譯錯(cuò)誤:屬性'name'可能為undefined

? 排錯(cuò):訪問可選屬性時(shí)加類型守衛(wèi):

if (user.name) {
  console.log(user.name.toUpperCase());
}

坑3:Record鍵類型不匹配

type UserRecord = Record<number, User>; // 鍵必須為number
userMap["user-1"] = { id: 1 }; // ? 類型錯(cuò)誤:鍵應(yīng)為數(shù)字

? 排錯(cuò):確保鍵類型與Record一致(如用stringsymbol)。

七、性能與安全注意

  • 性能
    所有高級(jí)類型在編譯階段處理,運(yùn)行時(shí)無額外開銷。類型檢查僅影響編譯速度(對(duì)大型項(xiàng)目影響可忽略)。

  • 安全
    無直接安全風(fēng)險(xiǎn)(如XSS),但錯(cuò)誤類型可能導(dǎo)致:

    • 運(yùn)行時(shí)錯(cuò)誤(如訪問undefined屬性)。
    • 邏輯缺陷(如API響應(yīng)未過濾敏感字段)。

?? 防御建議:

  1. 用Partial處理部分?jǐn)?shù)據(jù)時(shí),始終檢查可選屬性。
  2. 用Omit過濾字段后,驗(yàn)證API響應(yīng)是否包含預(yù)期字段。

八、與相關(guān)概念的對(duì)比

概念作用適用場景選型建議
Partial使屬性可選部分更新、表單優(yōu)先用,避免手寫可選類型
Required使屬性必需確保關(guān)鍵字段存在與Partial互補(bǔ),如Required<Partial<User>>
Pick選擇指定屬性提取部分字段用Pick替代Omit的逆操作
Omit移除指定屬性過濾字段(如脫敏)優(yōu)先用Omit,比Pick更直觀

? 選型建議:

  • 需要排除字段 → 用Omit。
  • 需要選擇字段 → 用Pick(如Pick<User, "id" | "name">)。
  • 無需Pick時(shí),避免用Omit + Pick組合。

結(jié)語:掌握核心,邁向高級(jí)類型

Record、Partial和Omit是TypeScript高級(jí)類型的基石,能顯著提升代碼的靈活性和可維護(hù)性。它們不是“炫技工具”,而是解決日常開發(fā)痛點(diǎn)的實(shí)用方案。

到此這篇關(guān)于TypeScript高級(jí)類型Record、Partial、Omit實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)TypeScript Record、Partial、Omit內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS 添加網(wǎng)頁桌面快捷方式的代碼詳細(xì)整理

    JS 添加網(wǎng)頁桌面快捷方式的代碼詳細(xì)整理

    如何添加桌面快捷?很多網(wǎng)友都有這個(gè)疑問;JS 點(diǎn)擊添加網(wǎng)頁桌面快捷方式的代碼,需要的朋友可以參考下
    2012-12-12
  • Mammoth.js安裝和配置指南詳細(xì)步驟

    Mammoth.js安裝和配置指南詳細(xì)步驟

    Mammoth.js是開源工具,將.docx文檔轉(zhuǎn)換為HTML格式,支持JavaScript開發(fā),這篇文章主要介紹了Mammoth.js安裝和配置指南的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Router解決跨模塊下的頁面跳轉(zhuǎn)示例

    Router解決跨模塊下的頁面跳轉(zhuǎn)示例

    開始模塊化開發(fā)項(xiàng)目之后,一個(gè)很重要的問題就是頁面見的跳轉(zhuǎn)問題,這篇文章主要介紹了Router解決跨模塊下的頁面跳轉(zhuǎn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • JavaScript手寫Promise核心原理

    JavaScript手寫Promise核心原理

    這篇文章主要介紹了JavaScript手寫Promise核心原理,promise?可以說是出場率很高的api了,這篇文章手寫一版promise,可以加強(qiáng)對(duì)promise的認(rèn)識(shí)
    2022-06-06
  • 高性能web開發(fā) 如何加載JS,JS應(yīng)該放在什么位置?

    高性能web開發(fā) 如何加載JS,JS應(yīng)該放在什么位置?

    所有瀏覽器在下載JS的時(shí)候,會(huì)阻止一切其他活動(dòng),比如其他資源的下載,內(nèi)容的呈現(xiàn)等等。至到JS下載、解析、執(zhí)行完畢后才開始繼續(xù)并行下載其他資源并呈現(xiàn)內(nèi)容。
    2010-05-05
  • 微信小程序中為什么使用var that=this

    微信小程序中為什么使用var that=this

    這篇文章主要介紹了小程序中為什么使用var that=this的相關(guān)知識(shí),本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • element?ui?-?el-button?重新渲染后disabled屬性失效問題解決

    element?ui?-?el-button?重新渲染后disabled屬性失效問題解決

    這篇文章主要介紹了elementui el-button重新渲染后disabled屬性失效問題解決,解決方法也很簡單,給el-button元素添加key值就可以了,需要的朋友可以參考下
    2023-07-07
  • Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解

    Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue的跨組件通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • javascript中$(function() {});寫與不寫有哪些區(qū)別

    javascript中$(function() {});寫與不寫有哪些區(qū)別

    javascript中$(function() {....}) 是jQuery中的經(jīng)典用法,等同于 $(document).ready(function() {....}) javascript中$(function() {});寫與不寫有哪些區(qū)別,需要的朋友可以參考下
    2015-08-08
  • Javascript事件熱鍵兼容ie|firefox

    Javascript事件熱鍵兼容ie|firefox

    Javascript熱鍵兼容ie,firefox,需要的朋友可以參考下。
    2010-12-12

最新評(píng)論

赤峰市| 高唐县| 绥中县| 佛教| 邛崃市| 墨竹工卡县| 石渠县| 晋中市| 友谊县| 莒南县| 雅江县| 南宁市| 玉溪市| 仁寿县| 灵宝市| 大冶市| 松滋市| 永吉县| 微博| 吉木萨尔县| 包头市| 忻州市| 福贡县| 揭阳市| 罗田县| 正镶白旗| 洛宁县| 大石桥市| 廊坊市| 和田县| 虞城县| 大安市| 成都市| 乐清市| 罗平县| 宝清县| 越西县| 方山县| 孟州市| 潞西市| 东丰县|