feat(typescript-types): Add OptionalKeysOf<T>

This commit is contained in:
T. R. Bernstein
2025-07-14 07:58:16 +02:00
parent 319ccac8a7
commit 48076172bf
3 changed files with 53 additions and 1 deletions

View File

@@ -0,0 +1,39 @@
import type { OptionalKeysOf } from '@/optional-keys-of.js'
import { expect } from 'tstyche'
interface Example1 {
requiredKey: number
optionalKey?: number
anotherOptional?: string
unknownNonOptionalKey: unknown
undefinedNonOptionalKey: undefined
neverKey: never
}
interface Example2 {
requiredKey2: number
optionalKey2?: number
anotherOptional2?: string
unknownNonOptionalKey2: unknown
undefinedNonOptionalKey2: undefined
neverKey2: never
}
type ExpectKeyOf<T, K extends keyof T> = { [P in K]: T[P] }
type KeysOfInGenericsPart<
Shape extends object,
Defaults extends Pick<Shape, OptionalKeysOf<Shape>>
> = Defaults
expect<OptionalKeysOf<Example1>>().type.toBe<'optionalKey' | 'anotherOptional'>()
expect<OptionalKeysOf<Example2>>().type.toBe<'optionalKey2' | 'anotherOptional2'>()
expect<OptionalKeysOf<Example1 | Example2>>().type.toBe<
'optionalKey' | 'anotherOptional' | 'optionalKey2' | 'anotherOptional2'
>()
expect<Pick<Example1, OptionalKeysOf<Example1>>>().type.toBe<
ExpectKeyOf<Example1, OptionalKeysOf<Example1>>
>()
type DefaultValues = { optionalKey: 1; anotherOptional2: 'asdf' }
expect<KeysOfInGenericsPart<Example1, DefaultValues>>().type.toBe<DefaultValues>()