【问题标题】: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
}

【问题讨论】:

    标签: typescript types union-types


    【解决方案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;
    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 2021-12-30
    • 2021-06-27
    • 2018-12-06
    • 2020-10-16
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多