Skip to content

Instantly share code, notes, and snippets.

@faustienf
Created November 17, 2019 12:42
Show Gist options
  • Save faustienf/92ce422b82bdcedcacd50842e10fd757 to your computer and use it in GitHub Desktop.
Save faustienf/92ce422b82bdcedcacd50842e10fd757 to your computer and use it in GitHub Desktop.
const obj = {
a: {
b: {
c: [1, 2, 3]
},
d: '',
f: true,
},
g: {
h: 2,
},
f: () => true,
e: false,
}
type IsObject<T> = T extends (...args: any[]) => any
? false
: T extends any[]
? false
: T extends object
? true
: false;
type IsArray<T> = T extends any[]
? true
: false;
type ValueOfArray<T> = T extends (infer K)[]
? K
: T
type DeepKeyOf<T extends ({ [K in any]: any } | any[])> = {
[K in keyof T]: IsObject<T[K]> extends true
? Partial<[K, DeepKeyOf2<T[K]>]>
: IsArray<T[K]> extends true
? Partial<[K, number[]]>
: Partial<[K]>
}[keyof T];
type DeepKeyOf2<T extends ({ [K in any]: any } | any[])> = {
[K in keyof T]: IsObject<T[K]> extends true
? Partial<[K, DeepKeyOf3<T[K]>]>
: IsArray<T[K]> extends true
? Partial<[K, number[]]>
: Partial<[K]>
}[keyof T];
type DeepKeyOf3<T extends ({ [K in any]: any } | any[])> = {
[K in keyof T]: IsObject<T[K]> extends true
? Partial<[K, DeepKeyOf4<T[K]>]>
: IsArray<T[K]> extends true
? Partial<[K, number[]]>
: Partial<[K]>
}[keyof T];
type DeepKeyOf4<T extends ({ [K in any]: any } | any[])> = {
[K in keyof T]: IsObject<T[K]> extends true
? Partial<[K, DeepKeyOf5<T[K]>]>
: IsArray<T[K]> extends true
? Partial<[K, number[]]>
: Partial<[K]>
}[keyof T];
type DeepKeyOf5<T> = {
[K in keyof T]: Partial<IsArray<T[K]> extends true
? [K, number[]]
: [K]>
}[keyof T];
const get = <T extends (any[] | {[K in number | string]: any}),
K extends DeepKeyOf<T>,
R = undefined>(
objOrArr: T,
keys: K,
defaultValue?: R,
) => {
return defaultValue;
}
// const res = get(obj, ['a', 'b', 'c', 2]); error
const c: DeepKeyOf<typeof obj> = ['a', ['b', ['c', [2]]]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment