【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.mzph.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…