refactor(typescript-types): Refine KeyPaths<T,O,F> logic
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import type { If } from './if.js'
|
||||
import type { IsEmptyString } from './is-empty-string.js'
|
||||
import type { IsUndefined } from './is-undefined.js'
|
||||
import type { Simplify } from './simplify.js'
|
||||
import type { Assign } from './assign.js'
|
||||
|
||||
interface KeyPaths_Options {
|
||||
@@ -20,15 +22,10 @@ type GetPrefixedKey<
|
||||
|
||||
type PrefixIfNot<Cond, Prefix, T> = If<Cond, T, Prefix | T>
|
||||
|
||||
type KeyPathOf<
|
||||
Obj,
|
||||
Key extends PropertyKey,
|
||||
Options extends Required<KeyPaths_Options>,
|
||||
Parent extends string,
|
||||
Filter = never
|
||||
> = Obj extends { [P in Key]: Record<PropertyKey, unknown> }
|
||||
? PrefixIfNot<Options['leavesOnly'], Parent, KeyPathsOfStringKeys<Obj[Key], Options, Filter, Parent>>
|
||||
: Parent
|
||||
type KeyPathOf<Obj, Options extends Required<KeyPaths_Options>, Parent extends string, Filter = never> =
|
||||
Obj extends Record<PropertyKey, unknown>
|
||||
? PrefixIfNot<Options['leavesOnly'], Parent, KeyPathsOfStringKeys<Obj, Options, Filter, Parent>>
|
||||
: If<IsUndefined<Obj>, never, Parent>
|
||||
|
||||
type KeyPathsOfStringKeys<
|
||||
Obj extends object,
|
||||
@@ -36,13 +33,13 @@ type KeyPathsOfStringKeys<
|
||||
Filter,
|
||||
Parent extends string = ''
|
||||
> = {
|
||||
[Key in keyof Obj & string]: [Filter] extends [Exclude<Filter, Obj[Key]>]
|
||||
? KeyPathOf<Obj, Key, Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>
|
||||
: never
|
||||
[Key in keyof Obj & string]: Obj[Key] extends Filter
|
||||
? never
|
||||
: KeyPathOf<Obj[Key], Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>
|
||||
}[keyof Obj & string]
|
||||
|
||||
export type KeyPaths<
|
||||
Obj extends object,
|
||||
Options extends KeyPaths_Options = {},
|
||||
Filter = null | undefined
|
||||
> = KeyPathsOfStringKeys<Obj, Assign<KeyPaths_Options, KeyPaths_DefaultOptions, Options>, Filter>
|
||||
> = Simplify<KeyPathsOfStringKeys<Obj, Assign<KeyPaths_Options, KeyPaths_DefaultOptions, Options>, Filter>>
|
||||
|
||||
Reference in New Issue
Block a user