首页
学习
活动
专区
工具
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

    今天你学C++了吗?——string(下)

    1、使用常量字符串进行初始化~ 像以前,我们初始化会建议在初始化列表进行初始化,这一次为了代码更加简便,我们首先使用初始化列表初始化string的长度~剩下的就可以使用已经初始化的长度在函数体里面进行初始化...也有很多的接口,这里我们只实现常用的接口~该函数用于在字符串中的指定位置插入另一个字符串或字符 1.指定位置开始插入n个相同字符 //insert字符 void my_string::insert...(索引)以及要复制的字符数,从而从原始字符串中提取出所需的部分~需要注意的是它不修改原始字符串:substr 函数不会修改调用它的原始字符串对象,而是返回一个新的字符串对象,该对象包含提取的子串~...(*this < s); } 当然,代码复用有很多种方式,选择自己喜欢的就好了~ 测试: 再看流插入/流提取运算符重载 流插入运算符(<<): 定义:将一个对象或数据插入到输出流中,如cout...流提取运算符(>>): 定义:从输入流中提取数据,并将其赋值给某个对象。 用途:主要用于从控制台、文件等输入流中读取数据。

    3500

    深入浅出 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 的类型推断是指编译器在没有显式类型注释的情况下自动推断和分配类型的能力。虽然鼓励显式类型,但编译器会尽可能使用上下文(如变量初始化、返回语句等)来推断类型。

    1K30

    C++:类和对象(上)

    访问限定符的域:从该限定符到下一限定符 或 从该限定符到 } 即类结束。...两者的一点不同是,在不写访问限定符的情况下,class的成员默认为private,而struct默认为public。 需要注意的两点: 1.类名可以代表类型,这样写代码可以方便。...一个类,我们不写的情况下,编译器会生成6个默认成员函数,前4个较为重要。 在C++11中又增添了2个默认成员函数,移动构造和移动赋值。 1.构造函数。...运算符重载是特殊的函数,其名字由operator和后面定义的运算符共同构成,有返回类型和参数列表,运算符重载后,其优先级和结合性与原先的运算符保持一致。...运算符重载不能重载语法中没有的符号来创建新的操作符,如:operator@。 重载运算符函数的参数个数和该运算符作用的运算对象数量⼀样多。

    11510

    【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传入一个联合类型,那么条件类型将会应用每一个联合类型的成员,然后联合。

    72820

    【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.3K20
    领券