feat(typescript-types): Fully rewrite KeyPaths<T,O,F>

This commit is contained in:
T. R. Bernstein
2025-07-17 16:40:19 +02:00
parent 527250a98a
commit c3238a6847
3 changed files with 30 additions and 26 deletions

View File

@@ -22,28 +22,27 @@ 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 object
? PrefixIfNot<Options['leavesOnly'], Parent, KeyPathsOfStringKeys<Obj, Options, Filter, Parent>>
> = Obj extends { [P in Key]: Record<PropertyKey, unknown> }
? PrefixIfNot<Options['leavesOnly'], Parent, KeyPathsOfStringKeys<Obj[Key], Options, Filter, Parent>>
: Parent
type DoesNotMatchFilter<T, Filter> = T extends Filter ? false : true
type KeyPathsOfStringKeys<
Obj extends object,
Options extends Required<KeyPaths_Options>,
Filter = never,
Filter,
Parent extends string = ''
> = {
[Key in keyof Obj & string]: DoesNotMatchFilter<Obj[Key], Filter> extends true
? KeyPathOf<Obj[Key], Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>
[Key in keyof Obj & string]: [Filter] extends [Exclude<Filter, Obj[Key]>]
? KeyPathOf<Obj, Key, Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>
: never
}[keyof Obj & string]
export type KeyPaths<
Obj extends object,
Filter = null | undefined | never,
Options extends KeyPaths_Options = {}
Options extends KeyPaths_Options = {},
Filter = null | undefined
> = KeyPathsOfStringKeys<Obj, Assign<KeyPaths_Options, KeyPaths_DefaultOptions, Options>, Filter>