TypeScript:从判别并集派生映射

TypeScript:从判别并集派生映射,typescript,discriminated-union,Typescript,Discriminated Union,我有一个区分的联合类型,它根据字符串文本字段区分类型。我想派生一个映射类型,将联合中的所有类型映射到它们相应的鉴别器文本值 e、 g 导出类型获取={ 键入:“fetch”, 数据类型:字符串 }; 获取的导出类型={ 类型:“已获取”, 值:T }; //在“type”属性上区分的联合类型 导出类型操作= |取回 |获取; //这将生成类型“fetch”|“fetched” //从类型 类型动作=动作['type']; //我想生成一个将鉴别器值映射到类型的映射类型 //包含联合类型,但以类似

我有一个区分的联合类型,它根据字符串文本字段区分类型。我想派生一个映射类型,将联合中的所有类型映射到它们相应的鉴别器文本值

e、 g

导出类型获取={
键入:“fetch”,
数据类型:字符串
};
获取的导出类型={
类型:“已获取”,
值:T
};
//在“type”属性上区分的联合类型
导出类型操作=
|取回
|获取;
//这将生成类型“fetch”|“fetched”
//从类型
类型动作=动作['type'];
//我想生成一个将鉴别器值映射到类型的映射类型
//包含联合类型,但以类似于
//派生了我的操作类型。
//例如。
键入WhatIWant={
取:取,
抓取的:抓取的
}
这在TypeScript中可能吗?

在TypeScript 2.8中引入了,您可以定义一个类型函数,给定一个判别并集以及判别式的键和值,该函数生成并集的单个相关成分:

type DiscriminateUnion<T, K extends keyof T, V extends T[K]> = 
  T extends Record<K, V> ? T : never

我想这是我想要的。希望有帮助;祝你好运

可能相关:后续内容:我尝试过在不使用泛型联合类型的情况下编写相同类型的
DiscriminateUnion
,也就是说,针对特定的联合类型。但是,如果不指定一些
t扩展MyUnionType
,它将无法工作。知道为什么吗?一个最小的例子:```那个例子太小了,里面什么都没有。您的问题的答案可能是,该技术使用了一个仅在您检查一个简单泛型类型参数时才有效的。当然,您可以使用泛型版本并创建一个新的类型别名,用于插入您的特定类型。如果你需要更多的帮助,也许你应该问一个新问题;对一个已有一年历史的答案发表评论并不是发布代码并关注您的问题的最佳场所。祝你好运这个答案令人惊讶。非常感谢。
type DiscriminateUnion<T, K extends keyof T, V extends T[K]> = 
  T extends Record<K, V> ? T : never
type MapDiscriminatedUnion<T extends Record<K, string>, K extends keyof T> =
  { [V in T[K]]: DiscriminateUnion<T, K, V> };
type WhatIWant = MapDiscriminatedUnion<Action, 'type'>;
type WhatIWant = {
  fetch: {
    type: "fetch";
    dataType: string;
  };
  fetched: {
    type: "fetched";
    value: Product;
  };
}