feat(typescript-types): Allow inversion of filter in KeyPaths<T, O, F>
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
import type { If } from './if.js'
|
||||
import type { Or } from './or.js'
|
||||
import type { And } from './and.js'
|
||||
import type { Not } from './not.js'
|
||||
import type { IsEmptyString } from './is-empty-string.js'
|
||||
import type { Extends } from './extends.js'
|
||||
import type { Concat } from './concat.js'
|
||||
import type { Assign } from './assign.js'
|
||||
@@ -20,15 +25,21 @@ interface KeyPaths_DefaultOptions {
|
||||
type ExtendsFilter<Obj, Key extends keyof Obj, Filter> =
|
||||
Extends<Obj[Key], Filter> extends false ? false : true
|
||||
|
||||
type IncludeElement<Obj, Key extends keyof Obj, Filter> = Obj extends never
|
||||
type IncludeElement<Obj, Key extends keyof Obj, Filter, Options extends RequiredOptions> = Obj extends never
|
||||
? false
|
||||
: Obj[Key] extends never
|
||||
? false
|
||||
: unknown extends Obj[Key]
|
||||
? false
|
||||
: ExtendsFilter<Obj, Key, Filter> extends false
|
||||
? true
|
||||
: false
|
||||
: Not<
|
||||
Or<
|
||||
And<ExtendsFilter<Obj, Key, Filter>, Not<Options['invertFilter']>>,
|
||||
And<
|
||||
And<Not<ExtendsFilter<Obj, Key, Filter>>, Options['invertFilter']>,
|
||||
Not<Obj[Key] extends object ? true : false>
|
||||
>
|
||||
>
|
||||
>
|
||||
|
||||
type AdaptKeyForOptionals<Obj, Key extends keyof Obj> = Key extends number | string
|
||||
? undefined extends Obj[Key]
|
||||
@@ -41,6 +52,10 @@ type AdaptKeyForOptionals<Obj, Key extends keyof Obj> = Key extends number | str
|
||||
type NonUndefined<Obj> = Obj extends undefined ? never : Obj
|
||||
type KeysOf<Obj> = Obj extends undefined ? never : Exclude<keyof Obj, keyof any[]>
|
||||
|
||||
type GetCurrentPrefixedKey<Parent extends string, Key extends string, Options extends RequiredOptions> =
|
||||
| Concat<Parent, Key, Options['separator']>
|
||||
| If<Or<Options['leavesOnly'], IsEmptyString<Parent>>, never, Parent>
|
||||
|
||||
type KeyPathsOfStringKeys<
|
||||
Obj,
|
||||
Key extends keyof Obj,
|
||||
@@ -48,9 +63,9 @@ type KeyPathsOfStringKeys<
|
||||
Filter,
|
||||
Parent extends string = ''
|
||||
> = Key extends Key
|
||||
? IncludeElement<Obj, Key, Filter> extends true
|
||||
? IncludeElement<Obj, Key, Filter, Options> extends true
|
||||
? Obj[Key] extends NonContainerType
|
||||
? Concat<Parent, AdaptKeyForOptionals<Obj, Key>, Options['separator']>
|
||||
? GetCurrentPrefixedKey<Parent, AdaptKeyForOptionals<Obj, Key>, Options>
|
||||
: KeyPathsOfStringKeys<
|
||||
NonUndefined<Obj[Key]>,
|
||||
KeysOf<Obj[Key]>,
|
||||
|
||||
Reference in New Issue
Block a user