feat(typescript-types): Add Get<O, P>

This commit is contained in:
T. R. Bernstein
2025-07-18 13:29:54 +02:00
parent 5461fc52b4
commit ac53d1e584
3 changed files with 46 additions and 0 deletions

View 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>>