type NonNullValue = {}; type AnyObject = Record; type EmptyObject = Record; type AnyFunction = (...args: any) => any; type AnyAsyncFunction = (...args: any) => Promise; type AnyConstructor = new (...args: any) => any; type AsObject = { [P in keyof A]: A[P]; }; /** Exclude keys of B from keys of A and returns keys. */ type DiffKeys = Exclude, Keys>; /** Exclude keys of B from keys of A and returns object. */ type Diff = Pick>; type IntersectionKeys = Extract, Keys>; type Intersection = Pick>; /** Merge objects. */ type Merge = Diff & B; type OmitStrict, Keys> extends never ? never : Pick, Keys>>)> = Pick, K extends Keys ? K : Keys>>; type ExcludeStrict = T extends U ? never : T; type ExtractStrict = T extends U ? T : never; type Override extends never ? Intersection : never> = { [P in keyof Merge]: Merge[P]; }; type Overwrite extends never ? Intersection : never> = Override; type IfExtends = [Type] extends [never] ? [T] extends [never] ? Then : Else : Extract extends never ? Else : Extract extends Type ? Then : Else; type KeysOfType = T extends T ? { [P in keyof T]-?: import('./internal').IsType extends true ? P : never; }[keyof T] : never; type ExcludeKeysOfType = Pick>>; type DeepExcludeKeysOfType = IfExtends, unknown> extends readonly (infer I)[] ? DeepExcludeKeysOfType[] : { [P in keyof A as import('./internal').IsType extends true ? never : P]: R['length'] extends Depth ? A[P] : DeepExcludeKeysOfType>; }, A>; type ExtractKeysOfType = Pick>; type BaseTypeOf = T extends string ? string | T : T extends number ? number | T : T extends boolean ? boolean | T : T; /** Useful for union types because `keyof ` is `never` */ type Keys = T extends T ? IfExtends, keyof T> : never; /** Returns keys recursively. */ type DeepKeys = IfExtends, unknown> extends readonly (infer ItemType)[] ? DeepKeys : Required[P], P>; }, AnyObject>>[Keys], FallbackProps>; type ExcludeTypes]>, T> : Extract], T>, K extends import('./internal').ExcludeTypesOptions = { pick: keyof A; }> = { [P in keyof A]: 'omit' extends keyof K ? P extends K['omit'] ? A[P] : Exclude : 'pick' extends keyof K ? P extends K['pick'] ? Exclude : A[P] : never; }; type OmitIndex = T extends T ? { [P in keyof T as string extends P ? never : number extends P ? never : P]: T[P]; } : never; type WithIndex = T extends T ? T & Record : never; type KeepTypes, T>, K extends Exclude>, keyof K> extends never ? never : Exclude>> extends never ? import('./internal').GetKeysOptions : never = { pick: keyof A; }> = ExcludeTypes<{ [P in keyof A as 'omit' extends keyof K ? P extends K['omit'] ? P : Extract extends never ? never : P : 'pick' extends keyof K ? P extends K['pick'] ? Extract extends never ? never : P : P : Extract extends never ? never : P]: 'omit' extends keyof K ? P extends K['omit'] ? A[P] : Extract : 'pick' extends keyof K ? P extends K['pick'] ? Extract : A[P] : Extract; }, never>; type Writeable = T extends T ? { -readonly [P in keyof T]: T[P]; } : never; type DeepWriteable = IfExtends, AnyObject, IfExtends, unknown> extends readonly (infer I)[] ? DeepWriteable[] : { -readonly [P in keyof T]: R['length'] extends Depth ? T[P] : DeepWriteable>; }, T>; type DeepPartial = IfExtends, AnyObject, IfExtends, unknown> extends readonly (infer RI)[] ? IfExtends, unknown> extends (infer I)[] ? DeepPartial[] : readonly DeepPartial[] : { [P in keyof T]?: (R['length'] extends Depth ? T[P] : DeepPartial>) | (ExactOptional extends false ? undefined : never); }, T>; type DeepRequired = IfExtends, AnyObject, IfExtends, unknown> extends readonly (infer RI)[] ? IfExtends, unknown> extends (infer I)[] ? DeepRequired[] : readonly DeepRequired[] : { [P in keyof T]-?: Exclude>, ExactOptional extends false ? undefined : never>; }, T>; type DeepReadonly = IfExtends, AnyObject, IfExtends, unknown> extends readonly (infer RI)[] ? readonly DeepReadonly[] : { readonly [P in keyof T]: R['length'] extends Depth ? T[P] : DeepReadonly>; }, T>; type RequiredKeepUndefined = T extends T ? { [K in keyof T]-?: [T[K]]; } extends infer U ? U extends Record ? { [K in keyof U]: U[K][0]; } : never : never : never; type RequiredSome = T extends T ? Omit & { [P in K]-?: NonNullable; } : never; type RequiredBut = T extends T ? Pick & { [P in Exclude]-?: Exclude; } : never; type RequiredStrict = T extends T ? { [P in keyof T]-?: Exclude; } : never; type PartialSome = T extends T ? Omit & { [P in K]?: T[P]; } : never; type PartialBut = T extends T ? Pick & { [P in Exclude]?: T[P]; } : never; type PartialRecord = { [P in K]?: T; }; /** Useful with `exactOptionalPropertyTypes` option. */ type OptionalToUndefined = T extends T ? { [K in keyof T]: undefined extends T[K] ? T[K] | undefined : T[K]; } : never; type RequiredInner = T extends T ? { [P in keyof T]: P extends K ? IfExtends, T[P]> : T[P]; } : never; type RequiredInnerKeepUndefined = T extends T ? { [P in keyof T]: P extends K ? IfExtends, T[P]> : T[P]; } : never; type PickInner> = T extends T ? { [P in keyof T]: P extends K ? Pick, IK extends Keys ? IK : never> : T[P]; } : never; type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? A : B; /** Pick only writeable keys. */ type PickWritable = { [P in keyof T as IfEquals<{ [Q in P]: T[P]; }, { -readonly [Q in P]: T[P]; }, P, never>]: T[P]; }; /** Pick only readonly keys. */ type PickReadonly = { [P in keyof T as IfEquals<{ [Q in P]: T[P]; }, { readonly [Q in P]: T[P]; }, P, never>]: T[P]; }; /** Pick only optional keys. */ type PickOptional = { [P in keyof T as IfEquals<{ [Q in P]: T[P]; }, { [Q in P]?: T[P]; }, P, never>]: T[P]; }; /** Pick only required keys. */ type PickRequired = { [P in keyof T as IfEquals<{ [Q in P]: T[P]; }, { [Q in P]-?: T[P]; }, P, never>]: T[P]; }; type OmitInner> = T extends T ? { [P in keyof T]: P extends K ? OmitStrict, IK extends Keys ? IK : never> : T[P]; } : never; /** Swap key and value */ type ReverseObject> = T extends T ? { [P in keyof T as T[P]]: P; } : never; /** Get values of enum as union. */ type EnumToUnion> = Keys<{ [P in keyof T as `${T[P]}`]: P; }>; type LowercaseKeys = T extends T ? { [P in keyof T as P extends number ? P : Lowercase>]: T[P]; } : never; /** Requires to define all of the keys. */ type DefineAll> = T; /** Exclude the first element. Using with const arrays (tuples). */ type Last = T extends [any, ...infer Rest] ? Rest : []; /** Append to the last of const array (tuple). */ type Push = [...A, T]; /** Returns the number (Length) of first elements. */ type Head = T['length'] extends 0 ? R : R['length'] extends Length ? R : T extends readonly [infer I, ...infer Rest] ? Head : R; /** Returns the number (Length) of last elements. */ type Tail = T['length'] extends 0 ? R : R['length'] extends Length ? R : T extends readonly [...infer I, (infer L)?] ? Tail : R; /** Skip the number (Length) of first elements. */ type Skip = T['length'] extends 0 ? T : R['length'] extends Length ? T : T extends readonly [unknown?, ...infer Rest] ? Skip : T; type InArray = T extends readonly [Item, ...infer _] ? true : T extends readonly [Item] ? true : T extends readonly [infer _, ...infer Rest] ? InArray : false; /** Useful with type checking utility like `asUniqueArray`. */ type ToUniqueArray = T extends readonly [infer X, ...infer Rest] ? InArray extends true ? [import('./internal').Invalid<['Encountered value with duplicates:', X]>] : readonly [X, ...ToUniqueArray] : T; /** Useful with type checking utility like `asUniqueArray`. */ type UniqueArray = import('./internal').LiftInvalid>; /** Used with type checking utility `asUniqueArray`. */ type AsUniqueArray = import('./internal').LiftInvalid<{ [I in keyof A]: unknown extends { [J in keyof A]: J extends I ? never : A[J] extends A[I] ? unknown : never; }[number] ? import('./internal').Invalid<['Encountered value with duplicates:', A[I]]> : A[I]; }>; /** */ type UnionToTuple, N = [T] extends [never] ? true : false> = true extends N ? [] : [...UnionToTuple>, L]; /** `RequiredUnionToTuple<'1' | '2' | '3', ['1', '3', '2']>` */ type RequiredUnionToTuple, UA = F extends readonly any[] ? TupleToUnion : never, Nothing = [U] extends [never] ? true : false> = number extends A['length'] ? never : true extends Nothing ? A['length'] extends 0 ? [] : never : A['length'] extends 0 ? true extends Nothing ? [] : never : [UA, ...RequiredUnionToTuple, Skip>]; /** Returns `never` if T is union type. */ type NonUnion = [T] extends [import('./internal').UnionToIntersection] ? T : never; type IfTuple = T extends ArrayLike ? (number extends T['length'] ? Then : Else) : Else; /** Returns union of tuple indices. */ type TupleIndices = T extends T ? Extract extends `${infer N extends number}` ? N : never : never; /** Returns union of tuple values. */ type TupleToUnion = T extends T ? Extract extends `${infer N extends number}` ? T[N] : never : never; /** * Converts `interface Methods { method(arg: 'type_1'): void; method(arg: 'type_2'): void; method(arg: 'type_3'): void; }` to `(arg: 'type_1') => void | (arg: 'type_2') => void | (arg: 'type_3') => void` * https://github.com/microsoft/TypeScript/issues/32164 */ type OverloadToUnion any, TPartialOverload = unknown> = TOverload extends (...args: infer TArgs) => infer TReturn ? TPartialOverload extends TOverload ? never : OverloadToUnion TReturn) & AsObject> | ((...args: TArgs) => TReturn) : never; /** * Used with discriminants. * @example * type U = { type: 'type1'; a: number } | { type: 'type2'; b: number }; * type Mapped = MapToKey; // => { type1: { type: 'type1'; a: number } } | { type2: { type: 'type2', b: number } } */ type MapToKey = U extends U ? U[K] extends string | number ? { [P in U[K]]: U; } : never : never; /** * @example * type A = { a: number; b: number } * type R = MapKeyAsArray; // { { a: number[]; b: number } } */ type MapKeyAsArray = T extends T ? { [P in keyof T]: P extends K ? readonly T[P][] : T[P]; } : never; /** * Replace getters functions by the same props. */ type GettersToProps = T extends T ? { [P in keyof T as P extends `get${infer S}` ? Uncapitalize : P]: P extends `get${string}` ? T[P] extends AnyFunction ? ReturnType : T[P] : T[P]; } : never; /** * Replace setters functions by the same props. */ type SettersToProps = T extends T ? { [P in keyof T as P extends `set${infer S}` ? Uncapitalize : P]: P extends `set${string}` ? T[P] extends (value: infer V) => any ? V : T[P] : T[P]; } : never; /** * Remove part from the string. */ type RemovePart = T extends `${infer S1}${Part}${infer S2}` ? `${S1}${S2}` : T; /** * Returns type of array item. */ type ArrayItem> = T extends ArrayLike ? U : never; /** * Returns `true` if type is any, or `false` for any other type. */ type IsAny = 0 extends 1 & T ? true : false; /** Returns array of integers, eg: [5, 6, 7, 8, 9] */ type IntRange = Exclude, import('./internal').Enumerate>;