export type Function = (...args: I) => O; export type ValueOf = T[keyof T]; export type Merge = Omit & B; export type Cast = T extends U ? T : U; export type SafeCast = [T] extends [never] ? U : Cast; export type Writable = { -readonly [K in keyof T]: T[K]; }; export type Default = undefined extends T ? U : T; export type Not = X extends true ? false : true; export type And = X extends true ? (Y extends true ? true : false) : false; export type Or = X extends true ? true : Y extends true ? true : false; export type AtLeastOne = [T, ...T[]]; export type AtLeastOneProperty = T extends undefined ? {} : { [K in keyof T]?: T[K]; } & { [K in keyof T]: Pick; }[keyof T]; export type ExactlyOneProperty = T extends undefined ? {} : { [K in keyof T]: { [P in K]: T[P]; } & { [P in Exclude]?: never; }; }[keyof T]; export type IsExtend = X extends Y ? true : false; export type IsEquivalent = IsExtend extends true ? IsExtend : false; export type IsIdentical = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false; export type IsEqual = IsIdentical, Normalize>; /** * For F1 function to extend F2 function, * F2 input should extend F1 input so that if you call F1 thinking it is F2, it still works. * IsStricterFunction is not an extension check as it allows F1 to require a stricter input than F2. */ export type IsStricterFunction = And, ReturnType>, IsExtend, Parameters>>; export type AssertExtends<_A extends B, B> = true; export type AssertNotExtends = A extends B ? false : true; export type AssertTrue<_T extends true> = true; export type AssertAll<_T extends true[]> = true; export type Join = S extends [infer H, ...infer T] ? `${Cast}${Join>}` : S extends [infer H] ? Cast : ''; export type Split = S extends `${infer H}${D}${infer T}` ? [H, ...Split, D>] : [S]; export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; /** * removes string index signature from Record */ export type ToSealedRecord> = { [K in keyof R as string extends K ? never : K]: R[K]; }; type NormalizeTuple = T extends [...infer A] ? { [K in keyof A]: Normalize; } : never; type NormalizeObject = T extends infer O ? { [K in keyof O]: Normalize; } : never; export type Normalize = T extends (...args: infer A) => infer R ? (...args: NormalizeTuple) => Normalize : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends Promise ? Promise> : T extends Buffer ? Buffer : T extends object ? NormalizeObject : T; type DeepPartialObject = T extends infer O ? { [K in keyof O]?: DeepPartial; } : never; export type DeepPartial = T extends (...args: infer A) => infer R ? (...args: DeepPartial) => DeepPartial : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends Promise ? Promise> : T extends Buffer ? Buffer : T extends object ? DeepPartialObject : T; export type SafeOmit = Omit; export type StringKeys = Extract; export type DistributivePick = T extends any ? Pick : never; export {};