refactor(typescript-types): Refine KeyPaths<T,O,F> logic

This commit is contained in:
T. R. Bernstein
2025-07-17 23:46:04 +02:00
parent c3238a6847
commit 5461fc52b4
2 changed files with 36 additions and 27 deletions

View File

@@ -4,7 +4,10 @@ import { expect } from 'tstyche'
interface ExampleObject {
nullvalue: null
simplevalue: string
optionalKey?: string
optionalKey?: {
nullvalue: null
simplevalue: string
}
unknownKey: unknown
neverKey: never
config: {
@@ -13,27 +16,36 @@ interface ExampleObject {
}
}
expect<KeyPaths<ExampleObject>>().type.toBe<'simplevalue' | 'config.simplevalue'>()
expect<KeyPaths<ExampleObject, {}, any>>().type.toBeAssignableTo<
'nullvalue' | 'simplevalue' | 'optionalKey' | 'config.nullvalue' | 'config.simplevalue'
>()
expect<KeyPaths<ExampleObject, {}, unknown>>().type.toBeAssignableTo<
'nullvalue' | 'simplevalue' | 'optionalKey' | '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<
'nullvalue' | 'simplevalue' | 'optionalKey' | 'unknownKey' | 'config.nullvalue' | 'config.simplevalue'
| 'nullvalue'
| 'simplevalue'
| 'optionalKey.nullvalue'
| 'optionalKey.simplevalue'
| 'unknownKey'
| 'config.nullvalue'
| 'config.simplevalue'
>()
expect<KeyPaths<ExampleObject, {}, null>>().type.toBe<
'simplevalue' | 'optionalKey.simplevalue' | 'unknownKey' | 'config.simplevalue'
>()
expect<KeyPaths<ExampleObject, {}, string>>().type.toBe<
'nullvalue' | 'optionalKey.nullvalue' | 'unknownKey' | 'config.nullvalue'
>()
expect<KeyPaths<ExampleObject, { separator: '-' }>>().type.toBe<
'simplevalue' | 'optionalKey-simplevalue' | 'unknownKey' | 'config-simplevalue'
>()
expect<KeyPaths<ExampleObject, {}, null>>().type.toBe<'simplevalue' | 'optionalKey' | 'config.simplevalue'>()
expect<KeyPaths<ExampleObject, {}, string>>().type.toBe<'nullvalue' | 'config.nullvalue'>()
expect<KeyPaths<ExampleObject, { separator: '-' }>>().type.toBe<'simplevalue' | 'config-simplevalue'>()
expect<KeyPaths<ExampleObject, { leavesOnly: false }>>().type.toBe<
'simplevalue' | 'config' | 'neverKey' | 'config.simplevalue'
'simplevalue' | 'optionalKey' | 'optionalKey.simplevalue' | 'unknownKey' | 'config' | 'config.simplevalue'
>()
expect<KeyPaths<any, {}, string>>().type.toBeAssignableTo<never>()
expect<KeyPaths<any, {}, any>>().type.toBeAssignableTo<never>()
expect<KeyPaths<never, {}, any>>().type.toBeAssignableTo<never>()
expect<KeyPaths<never, {}, never>>().type.toBeAssignableTo<never>()
expect<KeyPaths<any, {}, never>>().type.toBe<unknown>()
expect<KeyPaths<any, {}, string>>().type.toBeAssignableTo<unknown>()