С введением условных типов в TypeScript 2.8 вы можете определить функцию типа, которая, учитывая дискриминированное объединение, ключ и значение дискриминанта, создает единственную соответствующую составляющую объединения:
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;
};
}
как хотелось бы, я думаю. Надеюсь, это поможет; удачи!