feat(typescript-types): Make Assign assignable to Generics by removing optionals
This commit is contained in:
@@ -1,15 +1,19 @@
|
||||
import type { OptionalKeysOf } from './optional-keys-of.js'
|
||||
import type { Simplify } from './simplify.js'
|
||||
import type { PickAssignable } from './pick-assignable.js'
|
||||
|
||||
type GetNonOptionalValueAt<Obj, Key, Default> = Key extends keyof Obj
|
||||
? undefined extends Obj[Key]
|
||||
? Default
|
||||
: Obj[Key]
|
||||
: Default
|
||||
type RemoveOptionalValues<Obj extends object> = Omit<Obj, OptionalKeysOf<Obj>>
|
||||
type RemoveRequiredKeysOfFrom<Obj1 extends object, Obj2> = Omit<Obj2, keyof RemoveOptionalValues<Obj1>>
|
||||
type MergeInto<Target, Source extends object> = RemoveRequiredKeysOfFrom<Source, Target> &
|
||||
RemoveOptionalValues<Source>
|
||||
type MergeDefaults<
|
||||
Shape extends object,
|
||||
Defaults extends Pick<Required<Shape>, OptionalKeysOf<Shape>>,
|
||||
Obj extends Shape
|
||||
> = PickAssignable<MergeInto<Defaults, Obj>, keyof Shape>
|
||||
|
||||
export type Assign<
|
||||
Shape extends object,
|
||||
Defaults extends Pick<Required<Shape>, OptionalKeysOf<Shape>>,
|
||||
Obj extends Shape
|
||||
> = {
|
||||
[K in keyof Shape]-?: GetNonOptionalValueAt<Obj, K, K extends keyof Defaults ? Defaults[K] : never>
|
||||
}
|
||||
> = Simplify<Required<Shape> & MergeDefaults<Shape, Defaults, Obj>>
|
||||
|
||||
9
packages/typescript-types/src/is-undefined.ts
Normal file
9
packages/typescript-types/src/is-undefined.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { If } from './if.js'
|
||||
import type { IsAny } from './is-any.js'
|
||||
import type { IsNever } from './is-never.js'
|
||||
|
||||
export type IsUndefined<T> = If<
|
||||
IsAny<T>,
|
||||
false,
|
||||
If<IsNever<T>, false, T extends undefined ? (undefined extends T ? true : false) : false>
|
||||
>
|
||||
15
packages/typescript-types/src/pick-assignable.ts
Normal file
15
packages/typescript-types/src/pick-assignable.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import type { If } from './if.js'
|
||||
import type { IsNever } from './is-never.js'
|
||||
import type { IsUndefined } from './is-undefined.js'
|
||||
|
||||
export type PickAssignable<T, Keys> = If<
|
||||
IsNever<T>,
|
||||
{},
|
||||
If<
|
||||
IsUndefined<T>,
|
||||
{},
|
||||
{
|
||||
[K in keyof T as K extends Keys ? K : never]: T[K]
|
||||
}
|
||||
>
|
||||
>
|
||||
Reference in New Issue
Block a user