feat(typescript-types): Allow inversion of filter in KeyPaths<T, O, F>
This commit is contained in:
@@ -9,26 +9,76 @@ interface ExampleObject {
|
||||
undefinedKey: undefined
|
||||
undefinedOptionalKey?: undefined
|
||||
optionalKey?: string
|
||||
objectKey: {
|
||||
name: string
|
||||
age?: number
|
||||
}
|
||||
optionalObjectKey?: {
|
||||
name: string
|
||||
age?: number
|
||||
}
|
||||
arrayKey: [{ name: string; age: number }, 1]
|
||||
optionalArrayKey?: [{ name: string }, { age?: number }]
|
||||
}
|
||||
|
||||
type KeysWithDefaultSettings =
|
||||
| 'simplevalue'
|
||||
| 'objectKey.name'
|
||||
| 'arrayKey.0.name'
|
||||
| 'arrayKey.0.age'
|
||||
| 'arrayKey.1'
|
||||
|
||||
type KeysWithInvertFilterSettings =
|
||||
| 'nullvalue'
|
||||
| 'undefinedKey'
|
||||
| 'undefinedOptionalKey'
|
||||
| 'optionalKey?'
|
||||
| 'objectKey.age?'
|
||||
| 'optionalObjectKey?.age?'
|
||||
| 'optionalArrayKey?.1.age?'
|
||||
|
||||
type KeysWithSpecialSeparator =
|
||||
| 'simplevalue'
|
||||
| 'objectKey-name'
|
||||
| 'arrayKey-0-name'
|
||||
| 'arrayKey-0-age'
|
||||
| 'arrayKey-1'
|
||||
|
||||
type KeysWhenFilterIsSetToNever =
|
||||
| 'nullvalue'
|
||||
| 'simplevalue'
|
||||
| 'undefinedKey'
|
||||
| 'undefinedOptionalKey'
|
||||
| 'optionalKey?'
|
||||
| 'objectKey.name'
|
||||
| 'objectKey.age?'
|
||||
| 'optionalObjectKey?.name'
|
||||
| 'optionalObjectKey?.age?'
|
||||
| 'arrayKey.0.name'
|
||||
| 'arrayKey.0.age'
|
||||
| 'arrayKey.1'
|
||||
| 'optionalArrayKey?.0.name'
|
||||
| 'optionalArrayKey?.1.age?'
|
||||
|
||||
type KeysWithLeavesOnlyDisabled =
|
||||
| 'simplevalue'
|
||||
| 'objectKey'
|
||||
| 'objectKey.name'
|
||||
| 'arrayKey'
|
||||
| 'arrayKey.0'
|
||||
| 'arrayKey.0.name'
|
||||
| 'arrayKey.0.age'
|
||||
| 'arrayKey.1'
|
||||
|
||||
// type T = any extends never ? true : false
|
||||
// type A = KeyPaths<ExampleObject, {}, never>
|
||||
expect<KeyPaths<ExampleObject>>().type.toBe<
|
||||
'simplevalue' | 'arrayKey.0.name' | 'arrayKey.0.age' | 'arrayKey.1'
|
||||
>()
|
||||
// type A = KeyPaths<ExampleObject, { invertFilter: true }>
|
||||
expect<KeyPaths<ExampleObject>>().type.toBe<KeysWithDefaultSettings>()
|
||||
expect<KeyPaths<ExampleObject, { invertFilter: true }>>().type.toBe<KeysWithInvertFilterSettings>()
|
||||
expect<KeyPaths<ExampleObject, { separator: '-' }>>().type.toBe<KeysWithSpecialSeparator>()
|
||||
expect<KeyPaths<ExampleObject, { leavesOnly: false }>>().type.toBe<KeysWithLeavesOnlyDisabled>()
|
||||
|
||||
expect<KeyPaths<ExampleObject, {}, never>>().type.toBe<KeysWhenFilterIsSetToNever>()
|
||||
expect<KeyPaths<ExampleObject, {}, any>>().type.toBeAssignableWith<never>()
|
||||
|
||||
expect<KeyPaths<ExampleObject, { invertFilter: true }, never>>().type.toBeAssignableWith<never>()
|
||||
expect<KeyPaths<ExampleObject, { invertFilter: true }, any>>().type.toBe<KeysWhenFilterIsSetToNever>()
|
||||
|
||||
Reference in New Issue
Block a user