Typescript高級: 深入理解Extract類型

概述

  • 在TypeScript這一逐漸成為前端開發首選的靜態類型檢查語言中,類型系統提供了豐富的工具來幫助開發者編寫更加健壯和可維護的代碼。
  • 其中,Extract<T, U>是一個強大的內置實用類型,用于從一個聯合類型T中提取出屬于另一個類型U的那些類型。
  • 本文將深入探討Extract類型的工作原理、應用場景以及如何有效利用它來提升代碼的類型安全性和表達力。

什么是Extract<T, U>?

  • Extract<T, U>是一個條件類型,其定義為:從類型T中選取那些同時也可以被類型U賦值的類型
  • 簡而言之,它像一個過濾器,保留了T中與U兼容的部分
  • 在TypeScript的類型系統中,兼容性意味著一個類型可以被另一個類型所賦值
  • 例如,任何派生自基類的類型都可以賦值給基類類型

基本用法

type A = string | number | boolean;
type B = number | boolean;type C = Extract<A, B>; // 結果為: number | boolean
  • 在這個例子中,Extract<A, B>的結果是A類型中與B兼容的類型,即number和boolean

應用場景

  • 類型篩選:在處理復雜的聯合類型時,Extract可以幫助我們精煉出特定的類型,特別是在大型項目中處理API響應或狀態管理時,能夠有效地縮小類型范圍,提高代碼的可讀性和準確性

  • 泛型約束:結合泛型使用,Extract可以創建更加靈活且精確的類型約束。例如,在定義一個函數時,可以約束參數類型必須是某聯合類型的一個子集,從而限制函數的適用范圍

  • 類型映射:在實現類型映射或類型轉換時,Extract可以幫助我們基于類型兼容性進行有選擇的映射,特別是在處理多態或復雜類型系統設計時

實戰案例


1 )從API響應中提取特定類型

  • 假設你正在處理一個API響應,該響應可能包含多種類型的數據,但你只關心其中的某些類型
    type ApiResponse = { type: 'user'; data: User } | { type: 'post'; data: Post } | { type: 'comment'; data: Comment };type UserSpecificResponse = Extract<ApiResponse, { type: 'user' }>;
    

2 ) 泛型約束與類型映射

  • 考慮一個函數,它應該只處理某些特定類型的對象集合
    // UserSpecificResponse 現在是 { type: 'user'; data: User }
    type Animal = { kind: 'dog' | 'cat' | 'bird' };
    type Canine = { kind: 'dog' };function processCaninesOnly<T>(items: Array<Extract<T, Canine>>): void {// ...
    }const dogs: Array<{ kind: 'dog' }> = [{ kind: 'dog' }, { kind: 'dog' }];
    processCaninesOnly(dogs); // 正確,因為dogs數組元素的kind只能是'dog'
    

總結

  • Extract<T, U>類型是TypeScript中一個強大的工具,它通過條件類型實現了類型篩選,增強了類型系統的靈活性和表達力
  • 在處理復雜類型邏輯、泛型約束以及類型映射時,Extract能夠幫助開發者更精細地控制類型系統,寫出更加健壯和易于維護的代碼
  • 通過上述介紹和案例,希望你能夠掌握并充分利用Extract類型在實際項目中的應用,進一步提升你的TypeScript編碼體驗

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

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

相關文章

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成!

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成&#xff01; 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 這篇論文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一種新穎的技術&#xff0c…

Modal.method() 不顯示頭部的問題

ant-design中的Modal組件有兩種用法&#xff1a; 第一種是用標簽&#xff1a;<a-modal></a-modal> 第二種是用Api&#xff1a;Modal.info、Modal.warning、Modal.confirm...... 一開始項目中這兩種用法是混用的&#xff0c;后面UI改造&#xff0c;需要統一樣式&…

一個程序員的牢獄生涯(37)任務

星期一 任 務 我走回大鐐面前后,把雙手抱著的衣服遞給大鐐,但我并沒有把手里的東西也遞給他。現在的大鐐坐著,我站著,這個時候要給大鐐的話,肯定能被身邊的棍子或六子看到,甚至被所有號子里的人都看到。因為此時,所有人的目光都盯著我手里的衣服,盯著我和大鐐看。 “鐐…

Shell字符串變量

目標 能夠使用字符串的3種方式 掌握Shell字符串拼接 掌握shell字符串截取的常用格式 能夠定義Shell索引數組和關聯數組 能夠使用內置命令alias,echo,read,exit,declare操作 掌握Shell的運算符操作 Shell字符串變量 介紹 字符串&#xff08;String&#xff09;就是一系…

使用LabVIEW時遇到VISA屬性錯誤 -1073807331的解決方案

在LabVIEW或VeriStand中使用VISA屬性時&#xff0c;可能會遇到錯誤 -1073807331。這一錯誤的具體描述如下&#xff1a; 解決方案 導致VISA屬性出現此錯誤的原因主要有以下四種&#xff1a; 屬性不被使用的串行總線支持 示例 A.1&#xff1a;Is Port Connected VISA屬性僅支持由…

React(四)memo、useCallback、useMemo Hook

目錄 (一)memo API 1.先想一個情景 2.用法 (1)props傳入普通數據類型的情況 (2)props傳入對象的情況 (3)props傳入函數的情況 (4)使用自定義比較函數 3.什么時候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo實現組件記憶化 3.useMemo實現函數記憶化 …

如何停止 iPad 和 iPhone 之間共享短信,獨立接收和發送消息

概括 在當今高度互聯的數字世界中&#xff0c;Apple 設備之間的無縫連接性提供了極大的便利&#xff0c;尤其是在消息同步方面。iPhone 和 iPad 用戶通常可以享受到設備間短信的自動同步功能&#xff0c;這意味著無論是在哪個設備上&#xff0c;用戶都可以接收和回復消息。然而…

2024.5.26.python.exercise

# # 導入包 # from pyecharts.charts import Bar, Timeline # from pyecharts.options import LabelOpts, TitleOpts # from pyecharts.globals import ThemeType # # # 從文件中讀取信息 # GDP_file open("1960-2019全球GDP數據.csv", "r", encoding&quo…

A. Maximize?

time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an integer x&#x1d465;. Your task is to find any integer y&#x1d466; (1≤y<x)(1≤&#x1d466;<&#x1d465;) su…

深入理解python列表與字典:數據結構的選擇與性能差異

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、列表與字典&#xff1a;基礎數據結構的對比 二、列表&#xff1a;逐個遍歷的查找方式 …

Ceres求解優化問題

1. 簡介 Ceres Solver是專門用于求解非線性最小二乘問題的C開源庫,研究SLAM方向不過濾波和優化兩個技術路線,因此常用Ceres庫解決實際項目中的優化問題,當然還有g2o同樣可用,但就說明文檔而言,Ceres對新用戶更友好,g2o提供不多的文檔,更多是需要參考其它開源項目使用,所以筆者…

【JAVA】接口

前面我們說了說抽象類相關內容&#xff0c;這篇我們主要聊聊接口相關內容&#xff0c;這部分很重要&#xff0c;大家引起關注。 1. 接口 1.1 接口的概念 接口就是公共的行為規范標準&#xff0c;大家在實現時&#xff0c;只要符合規范標準&#xff0c;就可以通用。在Java中&am…

力扣 739. 每日溫度 python AC

單調棧 class Solution:def dailyTemperatures(self, temperatures):size len(temperatures)ll []ans [0] * sizefor i in range(size - 1, -1, -1):while ll and temperatures[i] > temperatures[ll[-1]]:ll.pop()if ll:ans[i] ll[-1] - ill.append(i)return ans

C語言 數組——向函數傳遞數組

目錄 把數組傳給函數&#xff08;Passing Arrays to Functions&#xff09; 向函數傳遞一維數組 向函數傳遞二維數組 數組在學生成績管理中的應用 例&#xff1a;計算每個學生的平均分 把數組傳給函數&#xff08;Passing Arrays to Functions&#xff09; 向函數傳遞一維…

gnocchi學習小結

背景 總結gnocchi 4.4版本gnocchi-metricd工作流程 入口 gnocchi.cli.metricd metricd stop after processing metric默認為0&#xff0c;調servicemanager run MetricdServiceManager __init__ 服務邏輯封裝到MetricdServiceManager初始化中 主要由MetricProcessor, Met…

基于Vue的前端自定義詢問彈框與輸入彈框組件的設計與實踐

基于Vue的前端自定義詢問彈框與輸入彈框組件的設計與實踐 摘要 隨著技術的不斷進步&#xff0c;前端開發面臨越來越多的挑戰&#xff0c;其中之一就是如何有效管理復雜的業務邏輯和用戶體驗。傳統的整塊應用開發方式在面對頻繁的功能變更和用戶體驗優化時&#xff0c;往往顯得…

python數據分析-CO2排放分析

導入所需要的package import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import datetime %matplotlib inline plt.rcParams[font.sans-serif] [KaiTi] #中文 plt.rcParams[axes.unicode_minus] False #負號 數據清洗…

MySQL數據表索引命名規范

在數據庫設計和開發過程中&#xff0c;索引是提高查詢性能的重要工具。合理的索引命名規范不僅能提高代碼的可讀性&#xff0c;還能便于維護和管理。本文將詳細介紹MySQL數據表索引的命名規范&#xff0c;包括不同類型索引的命名方法&#xff0c;并提供多個代碼示例以說明如何命…

SSH 遠程登錄系統和遠程拷貝

文章目錄 目錄 文章目錄 前言 一.SSH的基本用法 SSH基本用法&#xff1a; SSH無密碼登錄 二.SSH安全設置 三.SSH限制用戶 前言 很多時候服務器并沒有服務器&#xff0c;我們也不能每次都通過控制臺去管理服務器&#xff0c;這時候就需要遠程登錄&#xff0c;相比于Telnet&a…

京東應屆生公司內網說了一句‘什么時候被pdd收購‘,結果慘遭辭退

京東應屆生公司內網說了一句’什么時候被pdd收購’&#xff0c;結果慘遭公司開除 這個事最近在圈子討論比較多 前二天&#xff0c;有一個上海交大畢業的應屆生&#xff0c;在京東實習了9個月&#xff0c;好不容易轉正12天后&#xff0c;只因在內網說了一句話&#xff0c;就被…