I want to convert TypeScript union object types into interface type:
type ActionTypes = { action: 'A', data: number }
| { action: 'B', data: string }
| { action: 'C' }
// to: { A: number, B: string, C: undefined or never ? }
>Solution :
You could use key remapping via as
to iterate over the union members of ActionTypes
and pull out the action
prop as a key and the data
prop as a value (if it exists). Like this:
type Actions<T extends { action: string, data?: any }> = {
[U in T as U["action"]]: "data" extends keyof U ? U["data"] : UndefinedOrNever
}
(I don’t know whether you want undefined
or never
so just define UndefinedOrNever
to be what you want). Let’s test it out:
type ActionTypes = { action: 'A', data: number }
| { action: 'B', data: string }
| { action: 'C' }
type ActionsType = Actions<ActionTypes>
/* type ActionsType = {
A: number;
B: string;
C: UndefinedOrNever;
} */
Looks good!