/** Union to Intersection * * ```ts * UnionToIntersection<{ a: 1 } | { b: 2 } | { c: 3 }> => { a: 1 } & { b: 2 } & { c: 3 } * ``` */ export declare type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; /** Last of Union * * ```ts * LastOfUnion<1 | 2 | 3> => 3 * ``` * * @deprecated ***Black Magic*** * @deprecated Not recommended, rely on compiler internal implementation */ export declare type LastOfUnion = UnionToIntersection T : never> extends () => (infer R) ? R : never; /** * @deprecated ***Black Magic*** * @deprecated Not recommended, rely on compiler internal implementation */ declare type _UnionToTuple> = [L] extends [never] ? [] : [..._UnionToTuple>, L]; /** Union to Tuple * * ```ts * UnionToTuple<1 | 2 | 3> => [1, 2, 3] * ``` * * @deprecated ***Black Magic*** * @deprecated Not recommended, rely on compiler internal implementation */ export declare type UnionToTuple = _UnionToTuple; /** * ```ts * TuplePush<[1, 2], 3> => [1, 2, 3] * ``` */ export declare type TuplePush = [...T, V]; /** * ```ts * TupleUnshift<[1, 2], 3> => [3, 1, 2] * ``` */ export declare type TupleUnshift = [V, ...T]; /** * ```ts * TupleTail<[1, 2, 3]> => [2, 3] * ``` */ export declare type TupleTail = T extends [any, ...infer R] ? R : never; /** * ```ts * TupleFirst<[1, 2, 3]> => 1 * ``` */ export declare type TupleFirst = T extends [infer F, ...any[]] ? F : never; /** * ```ts * TupleLast<[1, 2, 3]> => 3 * ``` */ export declare type TupleLast = T[TupleTail['length']]; /** * ```ts * TupleBody<[1, 2, 3]> => [1, 2] * ``` */ export declare type TupleBody = T extends [...infer B, ...[any]] ? B : never; /** * ```ts * TupleConcat<[1, 2, 3], [4, 5]> => [1, 2, 3, 4, 5] * ``` */ export declare type TupleConcat = [...L, ...R]; declare type _TupleN = A['length'] extends N ? A : _TupleN; /** * ```ts * TupleN => [T, T, T, T, T] * ``` */ export declare type TupleN = number extends N ? T[] : _TupleN; /** * Make all properties in T writeable * * ```ts * Writeable => [1, 2, 3] * ``` */ export declare type Writeable = { -readonly [P in keyof T]: T[P]; }; /** * Make all properties in T writeable * * ```ts * DeepWriteable => [[1]] * ``` */ export declare type DeepWriteable = { -readonly [P in keyof T]: DeepWriteable; }; /** * Make all properties in T readonly * * ```ts * DeepReadonly<[[1]]> => readonly [readonly [1]] * ``` */ export declare type DeepReadonly = { readonly [P in keyof T]: DeepReadonly; }; /** * Make all properties in T optional * * ```ts * DeepPartial<{ a: { b: 1 } }> => { a?: { b?: 1 } } * ``` */ export declare type DeepPartial = { [P in keyof T]?: DeepPartial; }; /** * Make all properties in T required * * ```ts * DeepRequired<{ a?: { b?: 1 } }> => { a: { b: 1 } } * ``` */ export declare type DeepRequired = { [P in keyof T]-?: DeepRequired; }; /** * If `A` does not extends `E`, return `never` */ export declare type AssertType = A extends E ? A : never; /** Like `Map` */ export interface MapLike { get(key: K): V | undefined; has(key: K): boolean; } /** Like `Map` and mutable */ export interface MutableMapLike extends MapLike { set(key: K, value: V): this; delete(key: K): boolean; } /** * ```ts * MapKey> => K * ``` */ export declare type MapKey> = M extends MapLike ? K : never; /** * ```ts * MapValue> => V * ``` */ export declare type MapValue> = M extends MapLike ? V : never; /** Like `Set` */ export interface SetLike { has(value: T): boolean; } /** Like `Set` and mutable */ export interface MutableSetLike extends SetLike { add(value: T): this; delete(value: T): boolean; } /** * ```ts * SetValue> => T * ``` */ export declare type SetValue> = S extends SetLike ? V : never; /** * ```ts * GetKey<{ a: 1 }, 1> => 'a' * ``` * ```ts * enum Foo { A, B, C } * GetKey => 'B' * ``` */ export declare type GetKey = { [K in keyof T]: T[K] extends V ? K : never; }[keyof T]; /** * ```ts * PromiseValue> => T * ``` * @deprecated use `Awaited` in > ts 4.5 */ export declare type PromiseValue> = T extends PromiseLike ? V : never; /** * ```ts * LiteralObj<{ a: 1 } & { b: 2 }> => { a: 1, b: 2 } * ``` */ export declare type LiteralObj = T extends object ? { [K in keyof T]: T[K]; } : never; /** * Structure like a linked list */ export declare type LinkedTuple = [T] | [T, LinkedTuple]; /** * Take the union of depth tuple items, same as `T[number]` on Array * * ```ts * LinkedTupleUnion<[1, [2, [3]]]> => 1 | 2 | 3 * ``` */ export declare type LinkedTupleUnion = T extends LinkedTuple ? R : never; /** * Take Array Element Type * * ```ts * ArrayElement<1[]> => 1 * ``` */ export declare type ArrayElement = A extends (infer T)[] ? T : never; /** Prompt typescript this type is an array */ export declare type ArrayGuard = A extends any[] ? A : never; declare type _FlatTuple = 0 extends A['length'] ? R : _FlatTuple, [...R, ...(A[0] extends any[] ? _FlatTuple : [A[0]])]>; /** Flatten deep tuples * * ```ts * FlatTuple<[[1,[2]], [[[3]]]]> => [1, 2, 3] * ``` */ export declare type FlatTuple = _FlatTuple; /** Take key extract some value * * ```ts * KeyofExcludeValue<{ a: 1, b: 2, c: 3 }, 2 | 3> => 'a' * ``` */ export declare type KeyofExcludeValue = { [K in keyof T]: T[K] extends V ? never : K; }[keyof T]; /** Take key extract some value * * ```ts * KeyofExtractValue<{ a: 1, b: 2, c: 3 }, 2 | 3> => 'b' | 'c' * ``` */ export declare type KeyofExtractValue = { [K in keyof T]: T[K] extends V ? K : never; }[keyof T]; /** Pick object by value * * ```ts * PickValue<{ a: 1, b: 2, c: 3 }, 2 | 3> => { b: 2, c: 3 } * ``` */ export declare type PickValue = Pick>; /** Omit object by value * * ```ts * OmitValue<{ a: 1, b: 2, c: 3 }, 2 | 3> => { a: 1 } * ``` */ export declare type OmitValue = Pick>; /** Build Object from Entries * * ```ts * ObjFromEntries<['a', 1] | ['b', 2]> => { a: 1, b: 2 } * ``` */ export declare type ObjFromEntries = LiteralObj]: V; } : never>>; /** * ```ts * ObjKeys<{ a: 1, b: 2, c: 3 }> => 'a' | 'b' | 'c' * ``` */ export declare type ObjKeys = keyof T; /** * ```ts * ObjKeys<{ a: 1, b: 2, c: 3 }> => 1 | 2 | 3 * ``` */ export declare type ObjVals = T[keyof T]; /** Get all object key value entries * * ```ts * ObjEntry<{ a: 1, b: 2 }> => ['a', 1] | ['b', 2] * ``` */ declare type _ObjEntry = { [K in P]: [K, T[K]]; }[P]; export declare type ObjEntry = _ObjEntry; /** Get value by key for object key value entries * * ```ts * EntryValue<['a', 1] | ['b', 2], 'a'> => 1 * ``` */ export declare type EntryValue = E extends [infer P, infer V] ? P extends K ? V : K extends P ? V : never : never; /** Get key by value object key value entries * * ```ts * EntryKey<['a', 1] | ['b', 2], 1> => 'a' * ``` */ export declare type EntryKey = E extends [infer K, V] ? K : never; /** Get all object field path deeply * * ```ts * ObjPath<{ a: { b: { c: 1 } }[] }> => "a" | `a.${number}` | "a.length" | "a.toString" | "a.toLocaleString" | "a.pop" | "a.push" | "a.concat" | "a.join" | "a.reverse" | "a.shift" | "a.slice" | "a.sort" | "a.splice" | "a.unshift" | ... 18 more ... | `a.${number}.b.c` * ``` */ export declare type ObjPath = T extends object ? Extract | `${Extract}` | { [K in Extract]: `${K}.${ObjPath}`; }[Extract] : never; /** * Get object value by field path deeply * * ```ts * ValByPath<{ a: { b: { c: 1 } }[] }, 'a.0.b.c'> => 1 * ``` */ export declare type ValByPath> = ObjPathEntry extends [any, any] ? EntryValue, K> : never; declare type _ObjPatchEntry_ObjectKeys = { [K in Extract]: T[K] extends object ? K : never; }[Extract]; declare type _ObjPathEntry = T extends object ? { [K in Extract]: [`${Base}${K}`, T[K]]; }[Extract] | { [K in _ObjPatchEntry_ObjectKeys]: _ObjPathEntry; }[_ObjPatchEntry_ObjectKeys] : never; /** Get all object [field path, value] entry deeply * * ```ts * ObjPathEntry<{ a: { b: { c: 1 } } }> => ["a", { b: { c: 1 } }] | ["a.b", { c: 1 }] | ["a.b.c", 1] * ``` */ export declare type ObjPathEntry = _ObjPathEntry; /** Key Value Pairl */ export declare type Pair = [K, V]; /** Readonly Key Value Pairl */ export declare type ReadonlyPair = readonly [K, V]; /** Any Pair */ export declare type AnyPair = Pair | ReadonlyPair; /** Get Key of Pair */ export declare type PairKey = T extends AnyPair ? K : never; /** Get Key of Pair */ export declare type PairValue = T extends AnyPair ? V : never; export {};