feat(typescript-types): Make Assign assignable to Generics by removing optionals

This commit is contained in:
T. R. Bernstein
2025-07-15 12:00:02 +02:00
parent f7cde6388d
commit 4ec764de9e
7 changed files with 85 additions and 15 deletions

View File

@@ -11,21 +11,21 @@ interface OptionsWithRequired {
interface DefaultValues {
tag: 'Max Mustermann'
age: 17
relations: []
relations: Array<OptionsWithRequired>
}
expect<Assign<OptionsWithRequired, DefaultValues, { name: 'Another Name' }>>().type.toBe<{
name: 'Another Name'
tag: 'Max Mustermann'
age: 17
relations: []
relations: Array<OptionsWithRequired>
}>()
expect<Assign<OptionsWithRequired, DefaultValues, { name: 'Another Name'; age: 18 }>>().type.toBe<{
name: 'Another Name'
tag: 'Max Mustermann'
age: 18
relations: []
relations: Array<OptionsWithRequired>
}>()
interface Options {
@@ -39,8 +39,14 @@ expect<Assign<Options, DefaultValues, {}>>().type.toBe<{
}>()
interface SpecifiedOptions extends Options {}
expect<Assign<Options, DefaultValues, SpecifiedOptions>>().type.toBe<{
tag: 'Max Mustermann'
age: 17
}>()
type SomethingRequiringAllOptions<Opts extends Required<Options>> = Opts
type SomethingProvidingDefaultOptions<Opts extends Options = {}> = SomethingRequiringAllOptions<
Assign<Options, DefaultValues, Opts>
>
expect<SomethingProvidingDefaultOptions<{ age: 5 }>>().type.toBe<{ tag: 'Max Mustermann'; age: 5 }>()

View File

@@ -0,0 +1,11 @@
import type { IsUndefined } from '@/is-undefined.js'
import { expect } from 'tstyche'
expect<IsUndefined<undefined>>().type.toBe<true>()
expect<IsUndefined<1>>().type.toBe<false>()
expect<IsUndefined<'somestring'>>().type.toBe<false>()
expect<IsUndefined<null>>().type.toBe<false>()
expect<IsUndefined<unknown>>().type.toBe<false>()
expect<IsUndefined<any>>().type.toBe<false>()
expect<IsUndefined<never>>().type.toBe<false>()

View File

@@ -0,0 +1,21 @@
import type { PickAssignable } from '@/pick-assignable.js'
import { expect } from 'tstyche'
interface Example {
name: string
age: number
}
expect<PickAssignable<Example, 'name' | 'age'>>().type.toBe<Example>()
expect<PickAssignable<Example, any>>().type.toBe<Example>()
expect<PickAssignable<Example, 'name'>>().type.toBe<{ name: string }>()
expect<PickAssignable<Example, 'nonexisting'>>().type.toBe<{}>()
expect<PickAssignable<Example, never>>().type.toBe<{}>()
expect<PickAssignable<unknown, 'age'>>().type.toBe<{}>()
expect<PickAssignable<any, 'age'>>().type.toBe<{}>()
expect<PickAssignable<undefined, 'age'>>().type.toBe<{}>()
expect<PickAssignable<never, 'age'>>().type.toBe<{}>()