get-nested-object-property
Version:
A safe way to retrieve values from any level of the object cavity
3 lines (2 loc) • 12.1 kB
TypeScript
import { TPath, TFieldPathValue, TUnpackNestedValue } from './get-nested-object-property.types';
export declare const getNestedObjectProperty: <TObject extends object, TProperty extends TPath<TObject>>(object: TObject, propertyName: TProperty) => TUnpackNestedValue<TObject extends any ? TProperty extends `${infer K}.${infer R}` ? K extends keyof TObject ? R extends TPath<TObject[K]> ? TObject[K] extends infer T ? T extends TObject[K] ? T extends any ? R extends infer T_1 ? T_1 extends R ? T_1 extends `${string}.${string}` ? string extends infer T_2 ? T_2 extends string ? T_2 extends keyof T ? string extends infer T_3 ? T_3 extends string ? T_3 extends TPath<T[T_2]> ? T[T_2] extends infer T_4 ? T_4 extends T[T_2] ? T_4 extends any ? T_3 extends infer T_5 ? T_5 extends T_3 ? T_5 extends `${string}.${string}` ? string extends infer T_6 ? T_6 extends string ? T_6 extends keyof T_4 ? string extends infer T_7 ? T_7 extends string ? T_7 extends TPath<T_4[T_6]> ? T_4[T_6] extends infer T_8 ? T_8 extends T_4[T_6] ? T_8 extends any ? T_7 extends infer T_9 ? T_9 extends T_7 ? T_9 extends `${string}.${string}` ? string extends infer T_10 ? T_10 extends string ? T_10 extends keyof T_8 ? string extends infer T_11 ? T_11 extends string ? T_11 extends TPath<T_8[T_10]> ? T_8[T_10] extends infer T_12 ? T_12 extends T_8[T_10] ? T_12 extends any ? T_11 extends infer T_13 ? T_13 extends T_11 ? T_13 extends `${string}.${string}` ? string extends infer T_14 ? T_14 extends string ? T_14 extends keyof T_12 ? string extends infer T_15 ? T_15 extends string ? T_15 extends TPath<T_12[T_14]> ? T_12[T_14] extends infer T_16 ? T_16 extends T_12[T_14] ? T_16 extends any ? T_15 extends infer T_17 ? T_17 extends T_15 ? T_17 extends `${string}.${string}` ? string extends infer T_18 ? T_18 extends string ? T_18 extends keyof T_16 ? string extends infer T_19 ? T_19 extends string ? T_19 extends TPath<T_16[T_18]> ? T_16[T_18] extends infer T_20 ? T_20 extends T_16[T_18] ? T_20 extends any ? T_19 extends infer T_21 ? T_21 extends T_19 ? T_21 extends `${string}.${string}` ? string extends infer T_22 ? T_22 extends string ? T_22 extends keyof T_20 ? string extends infer T_23 ? T_23 extends string ? T_23 extends TPath<T_20[T_22]> ? T_20[T_22] extends infer T_24 ? T_24 extends T_20[T_22] ? T_24 extends any ? T_23 extends infer T_25 ? T_25 extends T_23 ? T_25 extends `${string}.${string}` ? string extends infer T_26 ? T_26 extends string ? T_26 extends keyof T_24 ? string extends infer T_27 ? T_27 extends string ? T_27 extends TPath<T_24[T_26]> ? T_24[T_26] extends infer T_28 ? T_28 extends T_24[T_26] ? T_28 extends any ? T_27 extends infer T_29 ? T_29 extends T_27 ? T_29 extends `${string}.${string}` ? string extends infer T_30 ? T_30 extends string ? T_30 extends keyof T_28 ? string extends infer T_31 ? T_31 extends string ? T_31 extends TPath<T_28[T_30]> ? T_28[T_30] extends infer T_32 ? T_32 extends T_28[T_30] ? T_32 extends any ? T_31 extends infer T_33 ? T_33 extends T_31 ? T_33 extends `${string}.${string}` ? string extends infer T_34 ? T_34 extends string ? T_34 extends keyof T_32 ? string extends infer T_35 ? T_35 extends string ? T_35 extends TPath<T_32[T_34]> ? T_32[T_34] extends infer T_36 ? T_36 extends T_32[T_34] ? T_36 extends any ? T_35 extends infer T_37 ? T_37 extends T_35 ? T_37 extends `${string}.${string}` ? string extends infer T_38 ? T_38 extends string ? T_38 extends keyof T_36 ? string extends infer T_39 ? T_39 extends string ? T_39 extends TPath<T_36[T_38]> ? any : never : never : never : T_38 extends `${number}` ? T_36 extends readonly (infer V)[] ? any : never : never : never : never : T_37 extends keyof T_36 ? T_36[T_37] : T_37 extends `${number}` ? T_36 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_34 extends `${number}` ? T_32 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_33 extends keyof T_32 ? T_32[T_33] : T_33 extends `${number}` ? T_32 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_30 extends `${number}` ? T_28 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_29 extends keyof T_28 ? T_28[T_29] : T_29 extends `${number}` ? T_28 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_26 extends `${number}` ? T_24 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_25 extends keyof T_24 ? T_24[T_25] : T_25 extends `${number}` ? T_24 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_22 extends `${number}` ? T_20 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_21 extends keyof T_20 ? T_20[T_21] : T_21 extends `${number}` ? T_20 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_18 extends `${number}` ? T_16 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_17 extends keyof T_16 ? T_16[T_17] : T_17 extends `${number}` ? T_16 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_14 extends `${number}` ? T_12 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_13 extends keyof T_12 ? T_12[T_13] : T_13 extends `${number}` ? T_12 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_10 extends `${number}` ? T_8 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_9 extends keyof T_8 ? T_8[T_9] : T_9 extends `${number}` ? T_8 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_6 extends `${number}` ? T_4 extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_5 extends keyof T_4 ? T_4[T_5] : T_5 extends `${number}` ? T_4 extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : never : T_2 extends `${number}` ? T extends readonly (infer V)[] ? V extends any ? string & TPath<V> extends infer T_40 ? T_40 extends string & TPath<V> ? T_40 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_40 extends keyof V ? V[T_40] : T_40 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : never : T_1 extends keyof T ? T[T_1] : T_1 extends `${number}` ? T extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : never : K extends `${number}` ? TObject extends readonly (infer V)[] ? V extends any ? R & TPath<V> extends infer T_43 ? T_43 extends R & TPath<V> ? T_43 extends `${string}.${string}` ? string extends infer T_41 ? T_41 extends string ? T_41 extends keyof V ? string extends infer T_42 ? T_42 extends string ? T_42 extends TPath<V[T_41]> ? any : never : never : never : T_41 extends `${number}` ? V extends readonly (infer V)[] ? any : never : never : never : never : T_43 extends keyof V ? V[T_43] : T_43 extends `${number}` ? V extends readonly (infer V_1)[] ? V_1 : never : never : never : never : never : never : never : TProperty extends keyof TObject ? TObject[TProperty] : TProperty extends `${number}` ? TObject extends readonly (infer V_1)[] ? V_1 : never : never : never> | null;