首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不指定构造函数的情况下从列表中提取区分的联合类型?

在 TypeScript 中,你可以使用映射类型(Mapped Types)和条件类型(Conditional Types)来从列表中提取区分的联合类型,而不需要显式地指定构造函数。以下是一个基本的例子:

代码语言:txt
复制
type List = { type: 'a'; value: string } | { type: 'b'; value: number };

// 使用映射类型和条件类型来提取 'a' 类型的 value
type ExtractAValue<T> = T extends { type: 'a'; value: infer U } ? U : never;

// 使用 ExtractAValue 提取 List 中 'a' 类型的 value
type AValues = ExtractAValue<List>; // string

// 类似地,提取 'b' 类型的 value
type ExtractBValue<T> = T extends { type: 'b'; value: infer U } ? U : never;

type BValues = ExtractBValue<List>; // number

在这个例子中,List 是一个联合类型,包含了两种不同的对象结构。ExtractAValueExtractBValue 是两个条件类型,它们检查传入的类型 T 是否符合特定的结构,并从中提取 value 字段的类型。

优势:

  • 类型安全:在编译时就能检查类型错误,避免运行时错误。
  • 代码清晰:通过类型别名和条件类型,可以清晰地表达复杂的类型逻辑。
  • 重用性:定义好的类型别名和条件类型可以在多个地方重用。

应用场景:

  • 当你需要处理多种不同类型的对象,但只关心它们共有的某些字段时。
  • 当你需要根据对象的某个属性来决定如何处理该对象时。

遇到的问题及解决方法: 如果你在尝试提取联合类型中的某个字段时遇到了问题,可能是因为 TypeScript 无法正确推断出类型。这时,你可以使用 infer 关键字来帮助 TypeScript 进行类型推断。

例如,如果你尝试提取一个更复杂的联合类型中的字段,但 TypeScript 提示错误,你可以尝试细化条件类型,或者使用多个条件类型组合来达到目的。

代码语言:txt
复制
type ComplexList = { type: 'a'; value: string } | { type: 'b'; value: number } | { type: 'c'; value: boolean };

// 提取 'a' 或 'b' 类型的 value
type ExtractABValue<T> = T extends { type: 'a' | 'b'; value: infer U } ? U : never;

type ABValues = ExtractABValue<ComplexList>; // string | number

在这个例子中,ExtractABValue 条件类型使用了 | 来指定 type 字段可以是 'a''b',这样就可以正确地提取这两种类型的 value 字段了。

参考链接:

  • TypeScript 官方文档关于映射类型:https://www.typescriptlang.org/docs/handbook/2/mapped-types.html
  • TypeScript 官方文档关于条件类型:https://www.typescriptlang.org/docs/handbook/2/conditional-types.html
  • TypeScript 官方文档关于 infer 关键字:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#type-inference-in-conditional-types
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++面试题

使用角度,虚函数主要用于在信息不全情况下,能使重载函数得到对应调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。...构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象类型,尽管我们可能通过实验室基类指针或引用去访问它但析构却不一定,我们往往通过基类指针来销毁对象。...内存分配方式有几种? 1) 全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行整个周期都有效,:全局变量、static静态变量。...2) 区分配:在执行函数时候,函数局部变量存储单元都可以栈中分配,函数执行结束后这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器指令集中,效率很高 但是分配内存容量有限...如有需要编译器会在成员之间加上填充字节; 3) 结构、联合或类总大小为最宽基本类型成员大小与#pragma pack指定数值较小那个整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

1.7K42

Typescript基础语法

接口中可以指定方法成员类型,通过 方法名: (形参列表) => 返回值类型 来表示,或者 方法名 (形参列表) :返回值类型 interface Person { firstName: string...,如下为官方demo,通过class关键字定义类,类成员表示与接口一样,同时,可以为类设定constructor——构造函数,constructor形参可以添加public修饰符,代表同时该形参同时表示一个...类通过implements关键字,指定要实现接口,需要类具备满足接口定义成员 创建类对象使用new 调用构造函数 interface Man{ fullName: string;...typescript还支持创建一个可以指代多种类型类型,通过|运算符,即可使用不同类型创建一个联合类型,代表当前变量为其中之一, let a : string | number; 类型别名 typescript...= string; type sTringNNumber = string | number; let a : tString; 枚举 与java类似,使用enum关键字创建枚举,默认枚举值为整数,指定整数值默认

1.5K20
  • 【笔记】《C++Primer》—— 第三部分:类设计者工具

    默认情况下lambda表达式不能改变它捕获变量因为它函数调用运算符被重载为const 标准库functional定义了一系列表示算术运算符,赋值运算符和默认析构函数模板类,我们可以用这些类替换掉默认运算符改变容器操作...但不同可调用对象有不同类型函数指针与函数对象是不同。...using语句并不要指定形参列表,可以将所有重载函数都加入派生类作用域中 继承体系,最关键是基类通常需要定义一个虚析构函数,这样我们才能动态分配体系对象,确保delete时能够执行正确析构函数版本...,写法和15.6指明重载基类函数一样,效果与定义一个空构造函数然后列表调用基类构造函数一致 和普通函数using不同,对构造函数using不会改变构造函数访问级别 当基类构造函数中有默认实参时...,我们可以用尾置返回来完成这个目标: 标准库头文件type_traits类来进行特殊类型转换能够动态地将这些语言特性消去传入参数中提取出我们想要类型 编译器是模板函数调用推断具体实参类型要求在

    1.7K10

    深入浅出 TypeScript

    P : any; 如果T能赋值给函数类型,则返回函数返回类型。通过infer P来提取函数返回类型。...2、infer P 表示待推断构造函数参数,如果T是构造函数,就返回构造函数类型参数P,否则返回never。 infer 应用 将元组转换为联合类型。...通过实现可以看出,先提取公用属性,然后T中进行取出。因此同样属性名,以T为准。.../* rootDirs可以指定一个路径列表,在构建时编译器会将这个路径列表路径内容都放到一个文件夹 */ "typeRoots": [], /...,里面包含指定文件相对或绝对路径,编译器在编译时候只会编译包含在files列出文件,如果指定,则取决于有没有设置include选项,如果没有include选项,则默认会编译根目录以及所有子目录文件

    2.9K30

    python自测100题「建议收藏」

    Python符合序列有序序列都支持切片(slice),:列表,字符,元祖 Python中切片格式:[start : end : step] Start:起始索引,0开始,-1表示结束;End:...PYTHONCASEOK – 在Windows中用于指示Python在import语句中查找第一个区分大小写匹配项。将此变量设置为任何值以激活它。...Q27.如何在Python执行模式匹配? 正则表达式(RE)使我们能够指定匹配给定字符串特定“部分”表达式。...这个也比较简单,在我们想计算长度字符串上调用函数len()即可。 len(‘Data 123’) 8 Q69.如何列表删除最后一个对象? 列表删除并返回最后一个对象或obj。...1)Python列表是高效通用容器。 它们支持(相当)有效插入,删除,追加和连接,Python列表推导使它们易于构造和操作。

    5.8K20

    python自测100题

    Python符合序列有序序列都支持切片(slice),:列表,字符,元祖 Python中切片格式:[start : end : step] Start:起始索引,0开始,-1表示结束;End:...PYTHONCASEOK - 在Windows中用于指示Python在import语句中查找第一个区分大小写匹配项。将此变量设置为任何值以激活它。...Q27.如何在Python执行模式匹配? 正则表达式(RE)使我们能够指定匹配给定字符串特定“部分”表达式。...这个也比较简单,在我们想计算长度字符串上调用函数len()即可。 len('Data 123') 8 Q69.如何列表删除最后一个对象? 列表删除并返回最后一个对象或obj。...1)Python列表是高效通用容器。 它们支持(相当)有效插入,删除,追加和连接,Python列表推导使它们易于构造和操作。

    4.7K10

    SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易

    然后,IDE 将运行为项目指定测试脚本。可以在 SQL 脚本和您 .NET 代码设置断点,这样可以简化调试过程。 添加函数就像将新类添加到任何其他项目类型一样。...您可以在 SELECT 列表中使用 RegexGroup 函数其他一些数据片段中提取特定信息片段。例如,如果您有一个存储了 URL 列,您现在可以轻松地分析此 URL 以确定各个片段。...现在问题是如何在 SQL 构造返回全部所需数据。表值函数可以解决这个问题。 表值函数有点类似先前函数,但在两个方面有所不同。首先,应用到方法属性必须完全声明返回表结构。其次,涉及两个方法。...此函数还可用于未以逗号分隔列表。也可处理以空格、分号、制表符、回车或任何其他可识别字符分隔列表。 ? 在匹配项中进行数据提取 类似于返回匹配项,我们还可以每个匹配项中提取数据。...还有许多确定执行匹配操作确切方法可能选项。如果您数据库排序区分大小写,您可能希望函数也以区分大小写方式执行匹配操作。可能会要求显式捕获选项以减少某些结果集。

    6.4K60

    去 BAT 面试,总结了这 50 道 MySQL 面试题!

    TEXT是一个区分大小写BLOB。四种TEXT类型 TINYTEXT TEXT MEDIUMTEXT和 LONGTEXT 它们对应于四种BLOB类型,并具有相同最大长度和存储要求。...BLOB和TEXT类型之间唯一区别在于对BLOB值进行排序和比较时区分大小写,对TEXT值区分大小写。...mysql_fetch_object - 数据库返回结果行作为对象。 30、我们如何在mysql运行批处理模式?...MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() - 日期值中提取给定数据。 HOUR(),MINUTE(),SECOND() - 时间值中提取给定数据。...因此,在这种情况下,能被存储在salary列范围是-9999999.99到9999999.99。在ANSI/ISO SQL92,句法DECIMAL(p)等价于DECIMAL(p,0)。

    3.2K20

    分享 30 道 TypeScript 相关面的面试题

    然后,让我们深入研究这个神奇列表,其中,包含 30 个富有洞察力 TypeScript 问题,范围基础知识到更高级(分为 25 个针对中级角色,5 个针对更高级角色),确保你为下一个重大机会做好准备...11、TypeScript 区分联合有什么用处? 答案:可区分联合(也称为标记联合)是一种结合了联合类型、文字类型类型保护模式。...答案:TypeScript never 类型表示永远不会出现值。它通常用于返回值函数 - 例如,那些总是抛出异常或具有无限循环函数。...23、您将如何在 TypeScript 创建和使用 mixin? 答案:Mixin 是一种可重用组件创建类模式。...答:TypeScript 类型推断是指编译器在没有显式类型注释情况下自动推断和分配类型能力。虽然鼓励显式类型,但编译器会尽可能使用上下文(变量初始化、返回语句等)来推断类型

    77830

    【TS 演化史 -- 17】各文件JSX工厂 、有条件类型和映射类型修饰符

    never类型是 TypeScript 底层类型,表示从未出现类型。 分布式有条件类型 那么,为什么e 条件类型和never类型组合是有用呢?它有效地允许咱们联合类型删除组成类型。...TypeScript 一个长期存在特性要求是能够提取给定函数返回类型。下面是ReturnType类型简化版本,该类型是在lib.es5.d.ts预定义。...Extract -- 提取T可以赋值给U类型。 NonNullable -- T剔除null和undefined。...ReturnType -- 获取函数返回值类型。 InstanceType -- 获取构造函数类型实例类型。...InstanceType InstanceType类型提取构造函数类型返回类型,它相当于构造函数ReturnType。

    2.5K20

    什么?CC++面试过不了?因为你还没看过这个!

    A() : a(0) { }; A(int x) : a(x) { }; // 初始化列表 // const可用于对重载函数区分 int getValue();...volatile 关键字声明变量,每次访问时都必须内存取出值(没有被 volatile 修饰变量,可能由于编译器优化, CPU 寄存器取值) const 可以是 volatile (只读状态寄存器...: using namespace_name::name; 构造函数 using 声明 在 C++11 ,派生类能够重用其直接基类定义构造函数。...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数类型...static_cast 用于非多态类型转换 执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型 float -> int) 可以在整个类层次结构中移动指针

    3.7K50

    C语言与C++面试知识总结

    A() : a(0) { }; A(int x) : a(x) { }; // 初始化列表 // const可用于对重载函数区分 int getValue();...volatile 关键字声明变量,每次访问时都必须内存取出值(没有被 volatile 修饰变量,可能由于编译器优化, CPU 寄存器取值) const 可以是 volatile (只读状态寄存器...: using namespace_name::name; 构造函数 using 声明 在 C++11 ,派生类能够重用其直接基类定义构造函数。...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数类型...static_cast 用于非多态类型转换 执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型 float -> int) 可以在整个类层次结构中移动指针

    5K41

    TypeScript系列教程九《类型转换》-- 条件类型

    类型转换是TS最好玩也是语言灵魂,想玩好需要熟练各种手段和工具,下面一一介绍类型转换一些常用手段。 条件类型 ---- 根据输入来决定输出是大多数有用程序核心,js也例外。...Item : Type; 在这里,我们使用infer关键字声明性地引入一个名为Item新泛型类型变量,而不是指定何在true分支检索T元素类型。...例如,对于简单情况,我们可以函数类型提取返回类型: type GetReturnType = Type extends (...args: never[]) => infer Return...无法基于参数类型列表执行重载解析。...Type[] : never; 如果给ToArray传入一个联合类型,那么条件类型将会应用每一个联合类型成员,然后联合

    71720

    【09】Spring源码-分析篇-DI源码分析

    ,所以需要根据配置文件配置参数或传入参数来确定最终调用构造函数。...// 2、自动装配模型为构造函数自动装配 // 3、给BeanDefinition设置了构造参数值 // 4、有参与构造函数参数列表参数 if (ctors !...protected void beforeSingletonCreation(String beanName) { // 如果当前在创建检查排除bean名列表包含该beanName且将beanName...会异常对应检测 protected void afterSingletonCreation(String beanName) { // 如果当前在创建检查排除bean名列表包含该beanName...缓存除了可以提高效率以外,还可以保证在并发情况下,返回PropertyDesciptor[]永远都是同一份 //bw提取一组经过筛选PropertyDesciptor,排除忽略依赖项或忽略项上定义属性

    1.1K20

    python面试题目及答案(数据库常见面试题及答案)

    它是一组规则,指定如何格式化Python代码以获得最大可读性。 Q6、如何在Python管理内存? python内存管理由Python私有堆空间管理。...Python是一种区分大小写语言。 Q12、什么是Python类型转换? 类型转换是指将一种数据类型转换为另一种数据类型。...Python数组和列表具有相同存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。 Q16、Python函数是什么? 函数是一个代码块,只有在被调用时才会执行。...[:: – 1]用于反转数组或序列顺序。 Q22、如何在Python随机化列表元素? 可以使用shuffle函数进行随机列表元素。...它们支持(相当)有效插入,删除,追加和连接,Python列表推导使它们易于构造和操作。

    11.2K20

    吐血总结!50道Python面试题集锦(附答案)「建议收藏」

    它是一组规则,指定如何格式化Python代码以获得最大可读性。 Q6、如何在Python管理内存? python内存管理由Python私有堆空间管理。...Python是一种区分大小写语言。 Q12、什么是Python类型转换? 类型转换是指将一种数据类型转换为另一种数据类型。...Python数组和列表具有相同存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。 Q16、Python函数是什么? 函数是一个代码块,只有在被调用时才会执行。...[:: – 1]用于反转数组或序列顺序。 Q22、如何在Python随机化列表元素? 可以使用shuffle函数进行随机列表元素。...它们支持(相当)有效插入,删除,追加和连接,Python列表推导使它们易于构造和操作。

    10.5K10

    100 个基本 Python 面试问题第一部分(1-20)

    但是,流程就像在定义函数后创建一个新列表一样。每当有人在没有列表参数情况下调用 extendList 方法时,都会使用相同方法。...以下是 Python 支持最常用内置类型列表: Python 不可变内置数据类型 Python 可变内置数据类型 数字 列表 字符串 字典 元组 集合 回到目录 ---- Q-6:如何在 Python...Python range()函数第零个索引开始。 回到目录 ---- Q-15:Python try-except 块可能有哪些可选语句?...回到目录 ---- Q-17:Python 切片是什么? 切片是一种字符串操作,用于提取字符串一部分,或列表某些部分。...在 Python , slice() 也是一个生成切片对象构造函数。结果是 range(start, stop, step) 提到一组索引。slice() 方法允许三个参数。

    1.7K21
    领券