feat(typescript-types): Allow inversion of filter in KeyPaths<T, O, F>
This commit is contained in:
@@ -7,11 +7,13 @@ import type { Assign } from './assign.js'
|
||||
interface KeyPaths_Options {
|
||||
separator?: string
|
||||
leavesOnly?: boolean
|
||||
invertFilter?: boolean
|
||||
}
|
||||
|
||||
interface KeyPaths_DefaultOptions {
|
||||
separator: '.'
|
||||
leavesOnly: true
|
||||
invertFilter: false
|
||||
}
|
||||
|
||||
type GetPrefixedKey<
|
||||
@@ -34,8 +36,16 @@ type KeyPathsOfStringKeys<
|
||||
Parent extends string = ''
|
||||
> = {
|
||||
[Key in keyof Obj & string]: Obj[Key] extends Filter
|
||||
? never
|
||||
: KeyPathOf<Obj[Key], Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>
|
||||
? If<
|
||||
Options['invertFilter'],
|
||||
KeyPathOf<Obj[Key], Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>,
|
||||
never
|
||||
>
|
||||
: If<
|
||||
Options['invertFilter'],
|
||||
never,
|
||||
KeyPathOf<Obj[Key], Options, GetPrefixedKey<Parent, Key, Options['separator']>, Filter>
|
||||
>
|
||||
}[keyof Obj & string]
|
||||
|
||||
export type KeyPaths<
|
||||
|
||||
@@ -16,12 +16,7 @@ interface ExampleObject {
|
||||
}
|
||||
}
|
||||
|
||||
expect<KeyPaths<ExampleObject>>().type.toBe<
|
||||
'simplevalue' | 'optionalKey.simplevalue' | 'unknownKey' | 'config.simplevalue'
|
||||
>()
|
||||
expect<KeyPaths<ExampleObject, {}, any>>().type.toBeAssignableTo<never>()
|
||||
expect<KeyPaths<ExampleObject, {}, unknown>>().type.toBeAssignableTo<never>()
|
||||
expect<KeyPaths<ExampleObject, {}, never>>().type.toBe<
|
||||
type AllKeys =
|
||||
| 'nullvalue'
|
||||
| 'simplevalue'
|
||||
| 'optionalKey.nullvalue'
|
||||
@@ -29,7 +24,14 @@ expect<KeyPaths<ExampleObject, {}, never>>().type.toBe<
|
||||
| 'unknownKey'
|
||||
| 'config.nullvalue'
|
||||
| 'config.simplevalue'
|
||||
|
||||
expect<KeyPaths<ExampleObject>>().type.toBe<
|
||||
'simplevalue' | 'optionalKey.simplevalue' | 'unknownKey' | 'config.simplevalue'
|
||||
>()
|
||||
expect<KeyPaths<ExampleObject, {}, any>>().type.toBeAssignableTo<never>()
|
||||
expect<KeyPaths<ExampleObject, {}, unknown>>().type.toBeAssignableTo<never>()
|
||||
expect<KeyPaths<ExampleObject, {}, never>>().type.toBe<AllKeys>()
|
||||
expect<KeyPaths<ExampleObject, { invertFilter: true }, any>>().type.toBe<AllKeys>()
|
||||
expect<KeyPaths<ExampleObject, {}, null>>().type.toBe<
|
||||
'simplevalue' | 'optionalKey.simplevalue' | 'unknownKey' | 'config.simplevalue'
|
||||
>()
|
||||
|
||||
Reference in New Issue
Block a user