Skip to content

Instantly share code, notes, and snippets.

@T99
Last active February 25, 2020 18:20
Show Gist options
  • Save T99/bba00c80ba2d42438db3bcb354c82a30 to your computer and use it in GitHub Desktop.
Save T99/bba00c80ba2d42438db3bcb354c82a30 to your computer and use it in GitHub Desktop.
A TypeScript type used to union together the keys of two or more objects.
type InternalMergedUnionType<T0 extends {}, T1 extends {}> = {
[K in keyof (T0 & T1)]: K extends keyof T0 ?
(K extends keyof T1 ?
T0[K] | T1[K] :
T0[K]) :
(K extends keyof T1 ?
T1[K] :
never);
};
type MergedUnionType<
T0 extends {},
T1 extends {},
T2 extends {} = {},
T3 extends {} = {},
T4 extends {} = {},
T5 extends {} = {},
T6 extends {} = {},
T7 extends {} = {},
T8 extends {} = {},
T9 extends {} = {}> =
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<
InternalMergedUnionType<T0, T1>, T2
>, T3
>, T4
>, T5
>, T6
>, T7
>, T8
>, T9
>;
type MyType1 = {
firstName: string,
lastName: string
};
type MyType2 = {
age: number,
alive: boolean,
firstName: null
};
type MyType3 = {
lastName?: number,
alive: boolean
};
declare let result: MergedUnionType<MyType1, MyType2, MyType3>;
result.firstName; // string | null
result.lastName; // string | number | undefined
result.age; // number
result.alive; // boolean
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment