UNPKG

reakit

Version:

Toolkit for building accessible rich web apps with React

72 lines (71 loc) 3.37 kB
/** * Creates an array like object with specified length * @template N Length */ export declare type ArrayWithLength<N extends number> = { [K in N]: any; }; /** * ["foo", "bar", 0, "baz"] * @template T Object with keys { foo: { bar: [{ baz }] } } * @template P Path ["foo", "bar", 0, "baz"] */ export interface DeepPathArray<T, P> extends ReadonlyArray<any> { ["0"]?: keyof T; ["1"]?: P extends { ["0"]: infer K0; } ? K0 extends keyof T ? keyof T[K0] : never : never; ["2"]?: P extends { ["0"]: infer K0; ["1"]: infer K1; } ? K0 extends keyof T ? K1 extends keyof T[K0] ? keyof T[K0][K1] : never : never : never; ["3"]?: P extends { ["0"]: infer K0; ["1"]: infer K1; ["2"]: infer K2; } ? K0 extends keyof T ? K1 extends keyof T[K0] ? K2 extends keyof T[K0][K1] ? keyof T[K0][K1][K2] : never : never : never : never; ["4"]?: P extends { ["0"]: infer K0; ["1"]: infer K1; ["2"]: infer K2; ["3"]: infer K3; } ? K0 extends keyof T ? K1 extends keyof T[K0] ? K2 extends keyof T[K0][K1] ? K3 extends keyof T[K0][K1][K2] ? keyof T[K0][K1][K2][K3] : never : never : never : never : never; ["5"]?: P extends { ["0"]: infer K0; ["1"]: infer K1; ["2"]: infer K2; ["3"]: infer K3; ["4"]: infer K4; } ? K0 extends keyof T ? K1 extends keyof T[K0] ? K2 extends keyof T[K0][K1] ? K3 extends keyof T[K0][K1][K2] ? K4 extends keyof T[K0][K1][K2][K3] ? keyof T[K0][K1][K2][K3][K4] : never : never : never : never : never : never; } /** * Returns the value within T object based on given array path * @template T Object with keys { foo: { bar: [{ baz }] } } * @template P Path ["foo", "bar", 0, "baz"] */ export declare type DeepPathArrayValue<T, P extends DeepPathArray<T, P>> = P extends ArrayWithLength<0 | 1 | 2 | 3 | 4 | 5 | 6> ? any : P extends ArrayWithLength<0 | 1 | 2 | 3 | 4 | 5> ? T[P[0]][P[1]][P[2]][P[3]][P[4]][P[5]] : P extends ArrayWithLength<0 | 1 | 2 | 3 | 4> ? T[P[0]][P[1]][P[2]][P[3]][P[4]] : P extends ArrayWithLength<0 | 1 | 2 | 3> ? T[P[0]][P[1]][P[2]][P[3]] : P extends ArrayWithLength<0 | 1 | 2> ? T[P[0]][P[1]][P[2]] : P extends ArrayWithLength<0 | 1> ? T[P[0]][P[1]] : P extends ArrayWithLength<0> ? T[P[0]] : never; /** * DeepPath argument * @template T Object with keys { foo: { bar: [{ baz }] } } * @template P ["foo", "bar", 0, "baz"] or "foo" */ export declare type DeepPath<T, P> = DeepPathArray<T, P> | keyof T; /** * DeepPath return * @template T Object with keys { foo: { bar: [{ baz }] } } * @template P ["foo", "bar", 0, "baz"] or "foo" */ export declare type DeepPathValue<T, P extends DeepPath<T, P>> = P extends DeepPathArray<T, P> ? DeepPathArrayValue<T, P> : P extends keyof T ? T[P] : any; /** * @template T Object * @template V Value */ export declare type DeepMap<T, V> = { [K in keyof T]: T[K] extends Array<infer U> | undefined ? U extends object ? Array<DeepMap<U, V>> : object extends U ? Array<DeepMap<U, V>> : Array<V> : T[K] extends object ? DeepMap<T[K], V> : object extends T[K] ? DeepMap<T[K], V> : V; }; /** * @template T Object */ export declare type DeepPartial<T> = { [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]>; };