typescript - 在标记的联合中提取联合类型
问题描述
我的代码中有一个类型
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
(因为类型经常变化)
解决方案
您可以编写自定义提取函数并使用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 };
推荐阅读
- javascript - 防止可穿戴手腕手势关闭屏幕
- elixir - 即使 2019b 已发布,ets.lookup 仍在从 2019a tzdata 文件返回 :tzdata_current_release, :release_version 的旧数据
- vba - 查找文档中是否存在数组中的任何样式
- sql - 找不到列“dbo”或用户定义的函数或聚合“dbo.GetUserBranchIDs”,或者名称不明确
- android - 浓缩咖啡 - 如何进行 2 次手指滑动?
- swift - swift中带有派生类的便利初始化器
- windows - 为什么我的 Web 服务在使用 Windows 身份验证时返回错误 401?
- c++ - 我有一个数组联合。从一个数组中读取一些元素并从另一个数组中读取其他元素是否可以?
- angular - 未使用 formControl 检查 Mat-checkbox
- php - 在尝试运行查询时,我得到了这个“错误:调用字符串上的成员函数查询()”并且似乎找不到修复