export type NonFunctionPropertyNames = { [K in keyof T]: T[K] extends Function ? never : K; }[keyof T]; export type NonFunctionProperties = Pick>; export type PlainObject = { [key: string]: T; }; export type PromiseReturnType = T extends (...args: any[]) => Promise ? P : T; export type DeepRequired = T extends PlainObject ? { [K in keyof T]-?: DeepRequired; } : T; export type OrPromise = T | Promise; export type Constructor = T extends abstract new (...args: infer P1) => infer R1 ? new (...args: P1) => R1 : T extends new (...args: infer P2) => infer R2 ? new (...args: P2) => R2 : never; export type Function

= (...args: P) => R; export type FunctionPropertyNames = { [K in keyof T]: T[K] extends Function ? K : never; }[keyof T]; export type Get = K extends keyof T ? T[K] : F; export type ObjectPropertyNames = { [K in keyof T]: T[K] extends PlainObject ? K : never; }[keyof T]; export type ArrayToUnion = T[number]; export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; export type LastOf = UnionToIntersection T : never> extends () => infer R ? R : never; export type Push = [...T, V]; export type UnionToTuple, N = [T] extends [never] ? true : false> = true extends N ? [] : Push>, L>;