feat(typescript-types): Adapt Get to KeyPaths and KeyPath changes
This commit is contained in:
@@ -1,25 +1,30 @@
|
||||
import type { If } from './if.js'
|
||||
import type { KeyPath } from './key-path.js'
|
||||
import type { KeyPaths } from './key-paths.js'
|
||||
import type { NonContainerType } from './non-container-type.js'
|
||||
import type { KeyPaths, KeyPaths_Options } from './key-paths.js'
|
||||
|
||||
type FilterUndefined<T> = T extends undefined ? never : T
|
||||
type FilterNull<T> = T extends null ? never : T
|
||||
type FilterUndefinedAndNull<T> = FilterUndefined<FilterNull<T>>
|
||||
type ExtractFromForKey<Obj, Rest, ResultType = never> = Obj extends unknown
|
||||
? never
|
||||
: Obj extends undefined
|
||||
? never
|
||||
: Obj extends NonContainerType
|
||||
? Obj | ResultType
|
||||
: GetByKeyPath<Obj, Rest, ResultType>
|
||||
|
||||
type ExtractFromForKey<Obj, Key, Rest> = Key extends keyof Obj
|
||||
? Obj[Key] extends Record<PropertyKey, unknown>
|
||||
? GetByKeyPath<Obj[Key], Rest>
|
||||
: Obj[Key]
|
||||
: Key extends keyof FilterUndefinedAndNull<Obj>
|
||||
? FilterUndefinedAndNull<Obj>[Key] | undefined
|
||||
: undefined
|
||||
type GetByKeyPath<Obj, Keys, ResultType = never> = Keys extends []
|
||||
? Obj
|
||||
: Keys extends [infer Key, ...infer Rest]
|
||||
? Key extends keyof Obj
|
||||
? ExtractFromForKey<Obj[Key], Rest, ResultType>
|
||||
: Key extends `${infer Key}?`
|
||||
? Key extends keyof Obj
|
||||
? ExtractFromForKey<Obj[Key], Rest, ResultType | undefined>
|
||||
: never
|
||||
: never
|
||||
: never
|
||||
|
||||
type HasNoMoreKeys<K> = K extends [] ? true : false
|
||||
|
||||
type GetByKeyPath<Obj, Keys> = If<
|
||||
HasNoMoreKeys<Keys>,
|
||||
Obj,
|
||||
Keys extends [infer Key, ...infer Rest] ? ExtractFromForKey<Obj, Key, Rest> : never
|
||||
>
|
||||
|
||||
export type Get<O extends object, P extends KeyPaths<O>> = GetByKeyPath<O, KeyPath<P>>
|
||||
export type Get<
|
||||
O,
|
||||
P extends KeyPaths<O, Options, Filter>,
|
||||
Options extends KeyPaths_Options = {},
|
||||
Filter = null | undefined
|
||||
> = GetByKeyPath<O, KeyPath<P>>
|
||||
|
||||
Reference in New Issue
Block a user