我有一个A型的:
type OneOf =
| {
$case: 'one';
one: One;
}
| {
$case: 'two';
two: Two;
}
| {
$case: 'three';
three: Three;
};
字符串
我想创建一个新的类型,能够从输入OneOf
中获取,获取输出One | Two | Three
。
我尝试了很多不同的方法,包括从this answer到UnionToIntersection
的方法,希望通过一个交集,我可以简单地排除$case
,在键上循环并返回类型。
我总是得到一个never
类型作为输出。
基本上,我认为我可以通过以下方式摆脱它:
type ExtractOneOfTypes<T, K extends keyof T = keyof T> = {
[key in K]: T extends { $case: key } ? T[key] : never;
}[K];
型
因为在我的oneOf中,对于每个$case
,在同一个对象上,有一个属性名称与$case
值相同。但这不起作用。有什么想法吗?
1条答案
按热度按时间cclgggtu1#
您可以
infer
$case
的文字值类型,然后使用嵌套的Conditional Type检查它是否是keyof T
,如下所示:字符串
TypeScript Playground