首页 > 解决方案 > 在标记的联合中提取联合类型

问题描述

我的代码中有一个类型

   type Test = {
      selector:
        | "t1"
        | "t2"
        | "t3"; // and t4 t5 ...
      data: any;
    }
  | {
      selector: "temp";
      data: any;
      prev: any;
    };

所以我想知道如何t1从这种类型中提取?

我已经看到了这个答案:https ://stackoverflow.com/a/52943170/1827594

这很好用

type Data = Extract<Test , { selector: "t1" | "t2" | "t3" /* and t4 t5 */ }>

但这不起作用

type Data = Extract<Test , { selector: "t1" }> // the type of Data is never

因此,如果它的联合类型超过两个(t3、t4 和 ...),我必须重复所有这些键。

t1有没有什么方法可以在Test不提供的情况下提取t2,t3,...

操场

更新

Test类型是为了提问而简化的,我正在寻找动态方式来实现这一点,并且与其他领域无关Test(因为类型经常变化)

标签: typescript

解决方案


您可以编写自定义提取函数并使用infer 关键字

 type Test = {
      selector:
        | "t1"
        | "t2"
        | "t3"; // and t4 t5 ...
      data: number;
    }
  | {
      selector: "temp";
      data: any;
      prev: any;
 };

type TestExtract<T> = T extends { selector: "t1" | "t2" | "t3", data: infer U }
  ? { selector: "t1", data: U }
  : never; 

type Data = TestExtract<Test> // {selector: "t1" , data: number };

推荐阅读