feat(typescript-types): Add Get<O, P>
This commit is contained in:
25
packages/typescript-types/src/get.ts
Normal file
25
packages/typescript-types/src/get.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import type { If } from './if.js'
|
||||
import type { KeyPath } from './key-path.js'
|
||||
import type { KeyPaths } 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, 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 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>>
|
||||
Reference in New Issue
Block a user