Skip to content

Instantly share code, notes, and snippets.

@mantaskaveckas
Created December 20, 2022 10:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mantaskaveckas/f4c5e0ef4b1affe2dfbd55790d94b9ca to your computer and use it in GitHub Desktop.
Save mantaskaveckas/f4c5e0ef4b1affe2dfbd55790d94b9ca to your computer and use it in GitHub Desktop.
TypeScript Union Merge
type CommonKeys<T extends object> = keyof T;
type AllKeys<T> = T extends any ? keyof T : never;
type Subtract<A, C> = A extends C ? never : A;
type NonCommonKeys<T extends object> = Subtract<AllKeys<T>, CommonKeys<T>>;
type PickType<T, K extends AllKeys<T>> = T extends { [k in K]?: any }
? T[K]
: undefined;
type Merge<T extends object> = {
[k in CommonKeys<T>]: PickTypeOf<T, k>;
} &
{
[k in NonCommonKeys<T>]?: PickTypeOf<T, k>;
};
type PickTypeOf<T, K extends string | number | symbol> = K extends AllKeys<T>
? PickType<T, K>
: never;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment