Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeScript: Map union type to another union type

Is it possible to map a union type to another union type in TypeScript?

What I'd Like to be able to do

e.g. Given a union type A:

type A = 'one' | 'two' | 'three';

I'd like to be able to map it to union type B:

type B = { type: 'one' } | { type: 'two'} | { type: 'three' };

What I have tried

type B = { type: A };

But this results in:

type B = { type: 'one' | 'two' | 'three' };

which is not quite what I want.

like image 520
bingles Avatar asked Aug 05 '18 03:08

bingles


1 Answers

You can use conditional type for distributing over the members of the union type (conditional type always takes only one branch and is used only for its distributive property, I learned this method from this answer)

type A = 'one' | 'two' | 'three';

type Distribute<U> = U extends any ? {type: U} : never;

type B = Distribute<A>;

/*
type B = {
    type: "one";
} | {
    type: "two";
} | {
    type: "three";
}
*/
like image 161
artem Avatar answered Oct 12 '22 01:10

artem