【TS學習】(15)分布式條件特性

在 TypeScript 中,分布式條件類型(Distributive Conditional Types) 是一種特殊的行為,發生在條件類型作用于裸類型參數(Naked Type Parameter) 時。這種特性使得條件類型可以“分布”到聯合類型的每個成員上,從而對聯合類型進行逐個處理。


1. 分布式條件類型的基本概念

(1) 定義
  • 當條件類型作用于一個裸類型參數(即沒有被包裹的泛型參數),并且該參數是一個聯合類型時,TypeScript 會將條件類型“分發”到聯合類型的每個成員上。
  • 這種行為稱為分布式條件類型
(2) 語法
type Distributed<T> = T extends U ? X : Y;
  • 如果 T 是一個聯合類型(如 A | B | C),則條件類型會分別對 ABC 應用 T extends U ? X : Y,并將結果重新組合成一個新的聯合類型。

2. 示例:分布式條件類型的作用

示例 1:基本行為
type IsString<T> = T extends string ? true : false;type Result = IsString<string | number>; // true | false

在這里:

  • string | number 是一個聯合類型。
  • 條件類型 IsString 會被“分發”到 stringnumber 上:
    • stringstring extends string ? true : falsetrue
    • numbernumber extends string ? true : falsefalse
  • 最終結果是 true | false

示例 2:提取字符串類型
type ExtractStrings<T> = T extends string ? T : never;type Result = ExtractStrings<string | number | boolean>; // string

在這里:

  • ExtractStrings 會逐個檢查聯合類型的每個成員:
    • stringstring extends string ? string : neverstring
    • numbernumber extends string ? number : nevernever
    • booleanboolean extends string ? boolean : nevernever
  • 最終結果是 string

3. 阻止分布式條件類型

如果不想讓條件類型“分布”,可以通過將裸類型參數包裹起來(例如使用數組或元組)來阻止分發。

示例:阻止分發
type IsString<T> = [T] extends [string] ? true : false;type Result = IsString<string | number>; // false

在這里:

  • [T]T 包裹在數組中,阻止了分發。
  • 整個聯合類型 string | number 被視為一個整體,而不是逐個成員處理。
  • 因為 string | number 不是 string 的子類型,所以結果是 false

4. 實際應用場景

分布式條件類型在實際開發中有許多用途,以下是一些常見的場景:

(1) 過濾聯合類型

你可以使用分布式條件類型從聯合類型中提取滿足條件的成員。

示例:過濾出可調用的類型
type FilterCallable<T> = T extends (...args: any[]) => any ? T : never;type MixedTypes = string | (() => void) | number | ((x: number) => number);type CallableTypes = FilterCallable<MixedTypes>; // () => void | ((x: number) => number)

在這里:

  • FilterCallable 提取了所有可調用的類型。

(2) 提取鍵名

你可以使用分布式條件類型提取對象的鍵名。

示例:提取值為字符串的鍵
type KeysOfType<T, U> = {[K in keyof T]: T[K] extends U ? K : never;
}[keyof T];type Data = {name: string;age: number;email: string;
};type StringKeys = KeysOfType<Data, string>; // "name" | "email"

在這里:

  • KeysOfType 提取了值類型為 string 的鍵名。

(3) 類型轉換

你可以使用分布式條件類型對聯合類型的每個成員進行轉換。

示例:為每個成員添加前綴
type AddPrefix<T, Prefix extends string> = T extends string? `${Prefix}${T}`: never;type Colors = "red" | "green" | "blue";type PrefixedColors = AddPrefix<Colors, "color_">; // "color_red" | "color_green" | "color_blue"

在這里:

  • AddPrefix 為聯合類型的每個成員添加了前綴。

5. 注意事項

(1) 裸類型參數是關鍵
  • 分布式條件類型只會在裸類型參數上觸發。
  • 如果類型參數被包裹(例如放在數組或元組中),分發行為會被阻止。
示例:裸類型與包裹類型的區別
type Distribute<T> = T extends string ? true : false;
type NoDistribute<T> = [T] extends [string] ? true : false;type Result1 = Distribute<string | number>; // true | false
type Result2 = NoDistribute<string | number>; // false
(2) 避免意外分發
  • 如果不希望觸發分發,可以通過包裹類型參數來顯式阻止。

6. 總結

  • 分布式條件類型的核心作用
    • 對聯合類型的每個成員逐個應用條件類型。
    • 支持靈活地過濾、轉換和操作聯合類型。
  • 關鍵點
    • 裸類型參數是觸發分發的關鍵。
    • 可以通過包裹類型參數阻止分發。
  • 實際場景
    • 過濾聯合類型。
    • 提取鍵名或特定類型的成員。
    • 動態轉換聯合類型的成員。

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

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

相關文章

NSSCTF [HGAME 2023 week1]simple_shellcode

3488.[HGAME 2023 week1]simple_shellcode 手寫read函數shellcode和orw [HGAME 2023 week1]simple_shellcode (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file vuln vuln: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpret…

PostgreSQL的擴展(extensions)-常用的擴展-pg_dirtyread

PostgreSQL的擴展&#xff08;extensions&#xff09;-常用的擴展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一個特殊擴展&#xff0c;它允許讀取已被刪除但尚未被 VACUUM 清理的數據行&#xff0c;是數據恢復的重要工具。 原理&#xff1a; pg_dirtyread 通過直接訪問表的…

linux3 mkdir rmdir rm cp touch ls -d /*/

Linux 系統的初始目錄結構遵循 FHS&#xff08;Filesystem Hierarchy Standard&#xff0c;文件系統層次標準&#xff09;&#xff0c;定義了每個目錄的核心功能和存儲內容。以下是 Linux 系統初始安裝后的主要目錄及其作用&#xff1a; 1. 核心系統目錄 目錄用途典型內容示例…

Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念

學習Bazel &#xff0c;就要學習Bazel 的規則定義&#xff0c; 弄清各個概念是重要的一個步驟。 在 Bazel 規則定義中&#xff0c;Symbol、Rule 和 Macro 是常見的概念。除此之外&#xff0c;Bazel 還有 Target、Provider、Aspect Repository、Package、 Workspace、 Configura…

深入探究 Hive 中的 MAP 類型:特點、創建與應用

摘要 在大數據處理領域,Hive 作為一個基于 Hadoop 的數據倉庫基礎設施,提供了方便的數據存儲和分析功能。Hive 中的 MAP 類型是一種強大的數據類型,它允許用戶以鍵值對的形式存儲和操作數據。本文將深入探討 Hive 中 MAP 類型的特點,詳細介紹如何創建含有 MAP 類型字段的表…

基于Java的區域化智慧養老系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘 要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;區域化智慧養老系統當然不能排除在外。區域化智慧養老系統是在實際應用和軟件工程的開發原理之上&#xff0c;運用Java語言、JSP技術以及…

關于JVM和OS中的指令重排以及JIT優化

關于JVM和OS中的指令重排以及JIT優化 前言&#xff1a; 這東西應該很重要才對&#xff0c;可是大多數博客都是以訛傳訛&#xff0c;全是錯誤&#xff0c;尤其是JVM會對字節碼進行重排都出來了&#xff0c;明明自己測一測就出來的東西&#xff0c;寫出來誤人子弟… 研究了兩天&…

VS2022遠程調試Linux程序

一、 1、VS2022安裝參考 VS Studio2022安裝教程&#xff08;保姆級教程&#xff09;_visual studio 2022-CSDN博客 注意&#xff1a;勾選的時候&#xff0c;要勾選下方的選項&#xff0c;才能調試Linux環境下運行的程序&#xff01; 2、VS2022遠程調試Linux程序測試 原文參…

WPF設計學習記錄滴滴滴4

<Button x:Name"btn"Content"退出"Width" 100"Height"25"Click"btn_Click" IsDefault"True"/> <Button x:Name"btn" <!-- 控件標識&#xff1a;定義按鈕的實例名稱為"btn&…

JVM 有哪些垃圾回收器

垃圾收集算法 標記-復制算法(Copying): 將可用內存按容量劃分為兩個區域,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面, 然后再把已使用過的內存空間一次清理掉。 標記-清除算法(Mark-Sweep): 算法分為“標記” 和“清除”兩個…

React DndKit 實現類似slack 類別、頻道拖動調整位置功能

一周調試終于實現了類 slack 類別、頻道拖動調整位置功能。 歷經四個版本迭代。 實現了類似slack 類別、頻道拖動調整功能 從vue->react &#xff1b;更喜歡React的生態及編程風格&#xff0c;新項目用React來重構了。 1.zustand全局狀態 2.DndKit 拖動 功能視頻&…

新浪財經股票每天10點自動爬取

老規矩還是先分好三步&#xff0c;獲取數據&#xff0c;解析數據&#xff0c;存儲數據 因為股票是實時的&#xff0c;所以要加個cookie值&#xff0c;最好分線程或者爬取數據時等待爬取&#xff0c;不然會封ip 廢話不多數&#xff0c;直接上代碼 import matplotlib import r…

使用Android 原生LocationManager獲取經緯度

一、常用方案 1、使用LocationManager GPS和網絡定位 缺點&#xff1a;個別設備,室內或者地下停車場獲取不到gps定位,故需要和網絡定位相結合使用 2、使用Google Play服務 這種方案需要Android手機中有安裝谷歌服務,然后導入谷歌的第三方庫&#xff1a; 例如&#xff1a;i…

驗證碼實現

驗證碼案例 學了Spring MVC &#xff0c;配置 相關章節&#xff0c; 現可以嘗試寫一個前后端交互的驗證碼 文章目錄 驗證碼案例前言一、驗證碼是什么&#xff1f;二、需求1.引入依賴2.導入前端頁面3.約定前后段交互接口 三、代碼解析Controllermodelapplication.xml 四丶結果五…

查詢當前用戶的購物車和清空購物車

業務需求&#xff1a; 在小程序用戶端購物車頁面能查到當前用戶的所有菜品或者套餐 代碼實現 controller層 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函數_1.2計算base的exponent次冪

題目&#xff1a; 鍵盤錄入兩個整數&#xff1a;底(base)和冪指數(exponent)&#xff0c;計算base的exponent次冪&#xff0c;并打印輸出對應的結果。&#xff08;注意底和冪指數都可能是負數&#xff09; 提示&#xff1a;求冪運算時&#xff0c;基礎的思路就是先無腦把指數轉…

【nacos安裝指南】

Nacos安裝指南 1.Windows安裝 開發階段采用單機安裝即可。 1.1.下載安裝包 在Nacos的GitHub頁面&#xff0c;提供有下載鏈接&#xff0c;可以下載編譯好的Nacos服務端或者源代碼&#xff1a; GitHub主頁&#xff1a;https://github.com/alibaba/nacos GitHub的Release下載…

通過發音學英語單詞:從音到形的學習方法

&#x1f4cc; 通過發音學英語單詞&#xff1a;從音到形的學習方法 英語是一種 表音語言&#xff08;phonetic language&#xff09;&#xff0c;但不像拼音文字&#xff08;如漢語拼音、西班牙語等&#xff09;那么規則&#xff0c;而是 部分表音部分表意。這意味著我們可以通…

列表某個字段由多個值組成,使用id匹配展示

說明&#xff1a;列表中字段A的值由多個值組成&#xff0c;但是后端返回的是這多個值的id字符串&#xff0c;需要前端拿著多個id組成的字符串去另一個接口數據源匹配展示 列表后端返回多個字符串如下&#xff1a; sectorName: "1899292545382895618,1907311191514636289…