UNPKG

defaults-deep-ts

Version:
21 lines (20 loc) 1.47 kB
declare type Undef = { '@Undefined$ymbol': true; }; declare type Undef2 = { '@Undefined2$ymbol': true; }; declare type NonUndef<T> = T extends Undef | Undef2 ? never : T; declare type NonNil<T> = T extends null | undefined ? never : T; declare type Converted<T> = { [P in keyof T]: Undef & Undef2 extends T[P] ? NonUndef<T[P]> | undefined : T[P]; }; declare type NonTraversable = string | number | bigint | boolean | symbol | Date; declare type DeepPartial<T> = { [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]>; }; declare type DefaultsDeep<T, U extends DeepPartial<T>> = { [P in keyof T]-?: NonNil<T[P]> extends NonTraversable ? null extends U[P] ? undefined extends U[P] ? undefined extends T[P] ? T[P] | Undef : T[P] : T[P] : undefined extends U[P] ? NonNil<T[P]> | Undef : NonNil<T[P]> : U[P] extends DeepPartial<T[P]> ? null extends U[P] ? undefined extends U[P] ? Converted<DefaultsDeep<T[P], NonNil<U[P]>>> | Undef2 : Converted<DefaultsDeep<T[P], NonNil<U[P]>>> : undefined extends U[P] ? Converted<NonNil<DefaultsDeep<T[P], NonNil<U[P]>>>> | Undef : Converted<NonNil<DefaultsDeep<T[P], NonNil<U[P]>>>> : undefined extends U[P] ? undefined extends T[P] ? T[P] | Undef : T[P] : T[P]; }; declare const defaultsDeep: <T, U extends DeepPartial<T>>(object: T, defaults: U) => Converted<DefaultsDeep<T, U>>; export default defaultsDeep;