/** Union to Intersection * * ```ts * UnionToIntersection<{ a: 1 } | { b: 2 } | { c: 3 }> => { a: 1 } & { b: 2 } & { c: 3 } * ``` */ export 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 type LastOfUnion = UnionToIntersection T : never> extends () => (infer R) ? R : never /** * @deprecated ***Black Magic*** * @deprecated Not recommended, rely on compiler internal implementation */ 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 type UnionToTuple = _UnionToTuple /** * ```ts * TuplePush<[1, 2], 3> => [1, 2, 3] * ``` */ export type TuplePush = [...T, V] /** * ```ts * TupleUnshift<[1, 2], 3> => [3, 1, 2] * ``` */ export type TupleUnshift = [V, ...T] /** * ```ts * TupleTail<[1, 2, 3]> => [2, 3] * ``` */ export type TupleTail = T extends [any, ...infer R] ? R : never /** * ```ts * TupleFirst<[1, 2, 3]> => 1 * ``` */ export type TupleFirst = T extends [infer F, ...any[]] ? F : never /** * ```ts * TupleLast<[1, 2, 3]> => 3 * ``` */ export type TupleLast = T[TupleTail['length']] /** * ```ts * TupleBody<[1, 2, 3]> => [1, 2] * ``` */ export type TupleBody = T extends [...infer B, ...[any]] ? B : never /** * ```ts * TupleConcat<[1, 2, 3], [4, 5]> => [1, 2, 3, 4, 5] * ``` */ export type TupleConcat = [...L, ...R] type _TupleN = A['length'] extends N ? A : _TupleN /** * ```ts * TupleN => [T, T, T, T, T] * ``` */ export type TupleN = number extends N ? T[] : _TupleN /** * Make all properties in T writeable * * ```ts * Writeable => [1, 2, 3] * ``` */ export type Writeable = { -readonly [P in keyof T]: T[P] } /** * Make all properties in T writeable * * ```ts * DeepWriteable => [[1]] * ``` */ export type DeepWriteable = { -readonly [P in keyof T]: DeepWriteable } /** * Make all properties in T readonly * * ```ts * DeepReadonly<[[1]]> => readonly [readonly [1]] * ``` */ export type DeepReadonly = { readonly [P in keyof T]: DeepReadonly } /** * Make all properties in T optional * * ```ts * DeepPartial<{ a: { b: 1 } }> => { a?: { b?: 1 } } * ``` */ export type DeepPartial = { [P in keyof T]?: DeepPartial } /** * Make all properties in T required * * ```ts * DeepRequired<{ a?: { b?: 1 } }> => { a: { b: 1 } } * ``` */ export type DeepRequired = { [P in keyof T]-?: DeepRequired } /** * If `A` does not extends `E`, return `never` */ export 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 type MapKey> = M extends MapLike ? K : never /** * ```ts * MapValue> => V * ``` */ export 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 type SetValue> = S extends SetLike ? V : never /** * ```ts * GetKey<{ a: 1 }, 1> => 'a' * ``` * ```ts * enum Foo { A, B, C } * GetKey => 'B' * ``` */ export 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 type PromiseValue> = T extends PromiseLike ? V : never /** * ```ts * LiteralObj<{ a: 1 } & { b: 2 }> => { a: 1, b: 2 } * ``` */ export type LiteralObj = T extends object ? { [K in keyof T]: T[K] } : never /** * Structure like a linked list */ export 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 type LinkedTupleUnion = T extends LinkedTuple ? R : never /** * Take Array Element Type * * ```ts * ArrayElement<1[]> => 1 * ``` */ export type ArrayElement = A extends (infer T)[] ? T : never /** Prompt typescript this type is an array */ export type ArrayGuard = A extends any[] ? A : never 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 type FlatTuple = _FlatTuple /** Take key extract some value * * ```ts * KeyofExcludeValue<{ a: 1, b: 2, c: 3 }, 2 | 3> => 'a' * ``` */ export 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 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 type PickValue = Pick> /** Omit object by value * * ```ts * OmitValue<{ a: 1, b: 2, c: 3 }, 2 | 3> => { a: 1 } * ``` */ export type OmitValue = Pick> /** Build Object from Entries * * ```ts * ObjFromEntries<['a', 1] | ['b', 2]> => { a: 1, b: 2 } * ``` */ export type ObjFromEntries = LiteralObj]: V } : never>> /** * ```ts * ObjKeys<{ a: 1, b: 2, c: 3 }> => 'a' | 'b' | 'c' * ``` */ export type ObjKeys = keyof T /** * ```ts * ObjKeys<{ a: 1, b: 2, c: 3 }> => 1 | 2 | 3 * ``` */ export type ObjVals = T[keyof T] /** Get all object key value entries * * ```ts * ObjEntry<{ a: 1, b: 2 }> => ['a', 1] | ['b', 2] * ``` */ type _ObjEntry = { [K in P]: [K, T[K]] }[P] export type ObjEntry = _ObjEntry /** Get value by key for object key value entries * * ```ts * EntryValue<['a', 1] | ['b', 2], 'a'> => 1 * ``` */ export 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 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 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 type ValByPath> = ObjPathEntry extends [any, any] ? EntryValue, K> : never type _ObjPatchEntry_ObjectKeys = { [K in Extract]: T[K] extends object ? K : never }[Extract] 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 type ObjPathEntry = _ObjPathEntry /** Key Value Pairl */ export type Pair = [K, V] /** Readonly Key Value Pairl */ export type ReadonlyPair = readonly [K, V] /** Any Pair */ export type AnyPair = Pair | ReadonlyPair /** Get Key of Pair */ export type PairKey = T extends AnyPair ? K : never /** Get Key of Pair */ export type PairValue = T extends AnyPair ? V : never