如何从打字稿中的标记联合类型中提取类型?

Posted

技术标签:

【中文标题】如何从打字稿中的标记联合类型中提取类型?【英文标题】:How to extract a type from a tagged union type in typescript? 【发布时间】:2019-03-27 08:10:43 【问题描述】:

假设已经有一个类型定义如下:

export type Item = 
  type: 'text',
  content: string
 | 
  type: 'link',
  url: string

是否可以从Item 类型中提取link 部分?我的意思是,是否可以定义一个类型ExtractTypeFrom

type LinkItem = ExtractType<Item, 'type', 'link'>

LinkItem 将是:


  type: 'link',
  url: string

【问题讨论】:

【参考方案1】:

是的,您可能非常接近,您可以使用预定义的Extract 条件类型。作为第二个参数,您可能需要传入一个类型,该类型可以是您正在寻找的类型的基本类型:

type LinkItem = Extract<Item,  type: 'link' > // will be   type: "link"; url: string; 

【讨论】:

太棒了,谢谢!如果你想要一个“Extractor”类型,你可以像这样定义它:type ItemExtractor&lt;Match extends Partial&lt;Item&gt;&gt; = Extract&lt;Item, Match&gt;,然后你可以像这样使用它:type LinkItem = ItemExtractor&lt; type: 'link' &gt; 其中泛型参数 type: 'link' 被类型检查为实际上是@的有效案例987654326@. 我喜欢 OP 的猜测与真实答案的接近程度 :-) 比我的尝试更好,即 Item &amp; type: 'link' (但不起作用) 还有一个令人惊讶的简单定义:) type Extract&lt;T, U&gt; = T extends U ? T : never;

以上是关于如何从打字稿中的标记联合类型中提取类型?的主要内容,如果未能解决你的问题,请参考以下文章

无法让嵌套类型保护与打字稿中的联合类型一起使用

获取/提取作为联合类型中的类型之一的类型的类型 - 打字稿

打字稿中具有联合类型键的松散类型对象

如何使用打字稿中的查找来推断类型化的 mapValues?

字符串枚举类似于打字稿中的类型[重复]

如何理解打字稿中的“属性'名称'在'用户'类型中是私有的”