UNPKG

@zodash/get

Version:

Get the value at path of object.

23 lines (22 loc) 1.79 kB
/** * Template Literal Types * [v4.1, released in Nov 2020](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-1.html#template-literal-types) * * References: * 1. https://dev.to/tipsy_dev/advanced-typescript-reinventing-lodash-get-4fhe * 2. https://dev.to/pouja/making-lodash-function-get-type-safe-313o */ declare type GetIndexedField<T, K> = K extends keyof T ? T[K] : K extends `${number}` ? '0' extends keyof T ? undefined : number extends keyof T ? T[number] : undefined : undefined; declare type FieldWithPossiblyUndefined<T, Key> = GetFieldType<Exclude<T, undefined>, Key> | Extract<T, undefined>; declare type IndexedFieldWithPossiblyUndefined<T, Key> = GetIndexedField<Exclude<T, undefined>, Key> | Extract<T, undefined>; export declare type GetFieldType<T, P> = P extends `${infer Left}.${infer Right}` ? Left extends keyof T ? FieldWithPossiblyUndefined<T[Left], Right> : Left extends `${infer FieldKey}[${infer IndexKey}]` ? FieldKey extends keyof T ? FieldWithPossiblyUndefined<IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>, Right> : undefined : undefined : P extends keyof T ? T[P] : P extends `${infer FieldKey}[${infer IndexKey}]` ? FieldKey extends keyof T ? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey> : undefined : undefined; /** * Get the value at path of object. * If the resolved values is undefined, the defaultValue is returnted in its place. * * @param value The object to query. * @param path The path of the property to get. * @param defaultValue The value returned for undefined resolved values. */ export declare function get<Obj extends object, Path extends string, Default = GetFieldType<Obj, Path>>(value: Obj, path: Path, defaultValue?: Default): GetFieldType<Obj, Path> | Default; export {};