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

TypeScript 實用工具類型之 Pick 類型實現(xiàn)

 更新時間:2026年05月14日 09:47:57   作者:夏安  
本文介紹TypeScript中的Pick實用工具類型,演示如何從已有類型中選擇特定屬性以生成新類型,簡化對象類型定義,具有一定的參考價值,感興趣的可以了解一下

這是一個關于 TypeScript 中的對象類型轉換的系列。在本系列中,我們首先將了解什么是對象類型轉換、需要轉換的情況以及它們與對象接口擴展的區(qū)別。然后,我們將仔細研究 TypeScript 提供的各種促進對象類型轉換的工具類型,比如:Pick<>、Omit<>Partial<>

我們將在本系列的每一篇文章中分別深入研究常用工具類型的詳細信息。在本部分中,我們將介紹如何使用 Pick<Type, Keys> 從基類型或接口中挑選一些屬性,從而從現(xiàn)有類型生成新類型。

1. 什么是對象類型轉換?

對象類型轉換是指從表示對象的現(xiàn)有類型或接口生成修改的類型。這樣的轉換與一個或多個屬性相關。

TypeScript 有各種實用工具,允許我們實現(xiàn)不同類型的對象類型轉換,比如從已有的類型中選擇或省略屬性。

當我們需要一堆相似的對象類型時,對象類型轉換變得非常方便,否則必須單獨定義它們。我們不需要單獨定義每個類型,而是可以利用 TypeScript 的轉換實用工具,通過要求進行小的調整,從現(xiàn)有類型生成新類型。通過這種方式,我們能夠使我們的類型可重用,并在模塊系統(tǒng)的任何地方隨時生成它們。

對象類型轉換不同于使用 extends 關鍵字的對象接口繼承,特別是因為繼承只能在對象接口上使用,而不能用于類型。盡管轉換也可以使用相同的實用工具應用于對象接口,但它們通常用于創(chuàng)建新的對象類型。

我們將基于下面的場景構建本系列中的示例,該場景涉及幾種不同類型的用戶。雖然重點將放在對象類型上,但我們也將把接口納入討論。

假設我們有一堆用戶實體,它們與博客的交互方式各不相同?;旧?,不管他們是訪客用戶、訂閱者、編輯器還是管理員等等。上面的 ERD 顯示了它們在后臺的類型。

現(xiàn)在,如果我們想為前端 API 調用建模這些類型,我們可以為每個用戶類型手動編寫 TypeScript 類型——這顯然違反了 DRY(不要寫重復的代碼)原則,因為我們?yōu)槊總€用戶類型重復了幾個公共屬性。我們也可以使用接口繼承,但這不在本系列的討論范圍之內。

所以,我們要做的是使用 TypeScript 的轉換實用工具從基類型中生成我們需要的類型。為了進行正確的轉換,我們需要方便地設置正確的基類型,然后將其與生成目標類型的實用工具配對。

例如,在本文中,我們將考慮 Pick<Type, Keys> 的用例。

2. 什么是 TypeScript Pick?

2.1 用 Pick<Type, Keys> 選擇項

對于圖中的上述實體,將 SuperbUser 作為基類型是有意義的,因為它包含了存在于所有其他用戶類型上的所有屬性。

我們將首先定義 SuperbUser 的接口:

interface SuperbUser {
  userId: number;
  macAddress: string;
  username: string;
  email: string;
  password: string;
  firstName: string;
  lastName: string;
  roles: ('Admin' | 'Editor' | 'Author')[]
};

現(xiàn)在,如果我們想從 SuperbUser 生成一個 GuestUser 類型,我們只需要選擇 userId, macAddressusername 屬性:

type GuestUser = Pick<SuperbUser, 'userId' | 'macAddress' | 'username'>;

TypeScript Pick 將基類型作為第一個參數(shù),將我們想要從基類型中選取的鍵的并集作為第二個參數(shù)。使用這兩種類型來聲明實際對象會給我們提供具有各自屬性的對象:

const me: SuperbUser = {
  userId: 1,
  macAddress: '1.2.3.4',
  username: '夏安',
  email: 'xiaan@163.com',
  password: '12345678',
  firstName: 'an',
  lastName: 'xia',
  roles: ['Admin', 'Editor', 'Author']
};

const guest: GuestUser = {
  userId: 2,
  macAddress: '4.3.2.1',
  username: 'xxx'
};

console.log(me.roles); // ["Admin", "Editor", "Author"]
console.log(guest.username); // "xxx"
console.log(guest.roles); // undefined

guest.roles 在運行時未定義,在此之前 TypeScript 就會拋出一個錯誤:

// Property 'roles' does not exist on type 'GuestUser'.

2.2 只能用來生成類型

注意,我們將 GuestUser 定義為具有 type 關鍵字的類型,盡管我們使用接口作為基。這是因為 TypeScript Pick<Type, Keys> 只能用來生成類型而不是接口。如果我們試圖用 interface 來定義它,TypeScript 會拋出一個錯誤:

interface GuestUser = Pick<SuperbUser, 'userId' | 'macAddress' | 'username'>;
// 'Pick' only refers to a type, but is being used as a value here.

2.3 從類型中選擇

轉換對于類型比接口更有用,因為我們不能繼承類型。如果我們將 SuperbUser 接口轉換為一種類型,我們會得到相同的結果:

type SuperbUser = {
  userId: number,
  macAddress: string,
  username: string,
  email: string,
  password: string,
  firstName: string,
  lastName: string,
  roles: ('Admin' | 'Editor' | 'Author')[]
};

type GuestUser = Pick<SuperbUser, 'userId' | 'macAddress' | 'username'>;

const me: SuperbUser = {
  userId: 1,
  macAddress: '1.2.3.4',
  username: '夏安',
  email: 'xiaan@163.com',
  password: '12345678',
  firstName: 'an',
  lastName: 'xia',
  roles: ['Admin', 'Editor', 'Author']
};

const guest: GuestUser = {
  userId: 2,
  macAddress: '4.3.2.1',
  username: 'xxx'
};

console.log(me.roles); // ["Admin", "Editor", "Author"]
console.log(guest.username); // "xxx"
console.log(guest.roles); // undefined

2.4 謹慎使用

現(xiàn)在,如果希望為 Subscriber 實體派生一個類型,則需要選擇除 roles 之外的所有屬性。但是,列出作為第二個參數(shù)傳遞的 union 類型中的所有屬性是沒有意義的:

// 工具類型的選擇不當
type Subscriber = Pick<SuperbUser, 'userId' | 'macAddress' | 'username' | 'email' | ... >;

相反,我們可以直接忽略實用程序類型中傳遞的角色。正如我們將在下一篇文章中看到的,我們可以用 Omit<Type, Keys> 來實現(xiàn)這一點。

3. 小結

在這篇文章中,我們發(fā)現(xiàn)當我們有共享屬性的對象時,對象類型轉換允許我們從基類型派生出類似的類型。我們看了一個例子,它使用 TypeScript Pick<> 從一個更大的類型中選擇一些屬性來創(chuàng)建一個新類型。我們發(fā)現(xiàn),類型轉換可以同時接受接口和類型作為其基礎,但是生成的類型不能聲明為接口。

到此這篇關于TypeScript 實用工具類型之 Pick 類型實現(xiàn)的文章就介紹到這了,更多相關TypeScript Pick類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS實現(xiàn)隨機亂撞彩色圓球特效的方法

    JS實現(xiàn)隨機亂撞彩色圓球特效的方法

    這篇文章主要介紹了JS實現(xiàn)隨機亂撞彩色圓球特效的方法,可實現(xiàn)彩色小球的碰撞效果,涉及隨機函數(shù)與頁面樣式的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • 對于Javascript 執(zhí)行上下文的全面了解

    對于Javascript 執(zhí)行上下文的全面了解

    下面小編就為大家?guī)硪黄獙τ贘avascript 執(zhí)行上下文的全面了解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 原生JS實現(xiàn)圖片輪播與淡入效果的簡單實例

    原生JS實現(xiàn)圖片輪播與淡入效果的簡單實例

    下面小編就為大家?guī)硪黄鶭S實現(xiàn)圖片輪播與淡入效果的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JS實現(xiàn)的駝峰式和連字符式轉換功能分析

    JS實現(xiàn)的駝峰式和連字符式轉換功能分析

    這篇文章主要介紹了JS實現(xiàn)的駝峰式和連字符式轉換功能,結合實例形式分析了JS實現(xiàn)字符串的駝峰式與連接符式轉換的實現(xiàn)技巧,涉及js字符串遍歷、轉換及正則表達式相關操作方法,需要的朋友可以參考下
    2016-12-12
  • js制作輪播圖效果

    js制作輪播圖效果

    這篇文章主要為大家詳細介紹了js制作輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 微信小程序實現(xiàn)tab頁面切換功能

    微信小程序實現(xiàn)tab頁面切換功能

    這篇文章主要介紹了微信小程序實現(xiàn)tab頁面切換功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Next.js服務端渲染超時導致生產事故的問題排查和解決辦法

    Next.js服務端渲染超時導致生產事故的問題排查和解決辦法

    Next.js是一個基于React的開源框架,用于構建服務端渲染(SSR)的Web應用程序,它簡化了許多復雜的配置,讓開發(fā)者可以專注于編寫應用邏輯而不是基礎設施,前幾天公司平臺首頁崩潰了 504 Time-out,這里記錄一下問題排查和解決的過程,需要的朋友可以參考下
    2025-03-03
  • 詳解javascript replace高級用法

    詳解javascript replace高級用法

    這篇文章主要介紹了詳解javascript replace高級用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • 再談JavaScript異步編程

    再談JavaScript異步編程

    再談JavaScript異步編程,簡單描述了幾種JavaScript異步編程模式,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 一次性讓大家搞懂JavaScript數(shù)組方法reduce、every、some

    一次性讓大家搞懂JavaScript數(shù)組方法reduce、every、some

    在JavaScript的數(shù)組工具庫中,every()和some()是處理邏輯判斷的黃金組合,下面這篇文章主要介紹了JavaScript數(shù)組方法reduce、every、some的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-07-07

最新評論

东宁县| 仲巴县| 依安县| 清河县| 通海县| 松江区| 尼木县| 太仆寺旗| 广宁县| 阿瓦提县| 毕节市| 郑州市| 泸定县| 家居| 米林县| 侯马市| 清水县| 日土县| 烟台市| 长汀县| 岚皋县| 湄潭县| 密山市| 县级市| 辽源市| 兴文县| 方山县| 靖西县| 宣城市| 集安市| 汨罗市| 兴海县| 安徽省| 乌苏市| 北海市| 金坛市| 四川省| 西乡县| 信阳市| 保亭| 开鲁县|