/**
 * Promise, or maybe not
 */ export type Awaitable < T > = T | PromiseLike < T > ; /**
 * Null or whatever
 */ export type Nullable < T > = T | null | undefined ; /**
 * Array, or not yet
 */ export type Arrayable < T > = T | Array < T > ; /**
 * Function
 */ export type Fn < T = void > = ( ) => T ; /**
 * Constructor
 */ export type Constructor < T = void > = new ( ... args ) => T ; /**
 * Infers the element type of an array
 */ export type ElementOf < T > = T extends ( infer E ) [ ] ? E : never ; param U returns see https export type UnionToIntersection < U > = ( U extends unknown ? ( k : U ) => void : never ) extends ( ( k : infer I ) => void ) ? I : never ; /**
 * Infers the arguments type of a function
 */ export type ArgumentsType < T > = T extends ( ( ... args : infer A ) => any ) ? A : never ; export type MergeInsertions < T > = T extends object ? { [ K in keyof T ] : MergeInsertions < T [ K ] > ; } : T ; export type DeepMerge < F , S > = MergeInsertions < { [ K in keyof F | keyof S ] : K extends keyof S & keyof F ? DeepMerge < F [ K ] , S [ K ] > : K extends keyof S ? S [ K ] : K extends keyof F ? F [ K ] : never ; } > ;