type ObjectWithPrefix = { [K in keyof T as K extends string ? `${P}.${K}` : never]: T[K]; }; type NestedKeyOf = { [Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object ? `${Key}` | `${Key}.${NestedKeyOf}` : `${Key}`; }[keyof ObjectType & (string | number)]; type KeysMatchingValueType = { [K in keyof T]: T[K] extends V ? K : never; }[keyof T]; type PickEventParameters = { [P in K]: T[K] extends (...args: any[]) => any ? Parameters : []; }; type Last = T extends [...infer _I, infer L] ? L : T extends [...infer _I, (infer L)?] ? L | undefined : never; type AllButLast = T extends [...infer H, infer _L] ? H : any[]; type AllButFirst = T extends [infer _F, ...infer H] ? H : any[]; type AllButFirstOrLast = AllButLast>; type OmitFirstArg = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never; type FunctionType = (...args: any[]) => any; type EventMapEmit = (name: T, ...args: K extends FunctionType ? Parameters : K extends any[] ? K : [K]) => K extends FunctionType ? ReturnType : void; type ArrayUnion = T[number]; type PromiseWithResolver = { promise: Promise; resolve: (value: T | PromiseLike) => void; reject: (reason?: any) => void; }; export type { AllButFirst, AllButFirstOrLast, AllButLast, ArrayUnion, EventMapEmit, KeysMatchingValueType, Last, NestedKeyOf, ObjectWithPrefix, OmitFirstArg, PickEventParameters, PromiseWithResolver };