123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import {Primitive} from './basic';
- /**
- Create a type from another type with all keys and nested keys set to optional.
- Use-cases:
- - Merging a default settings/config object with another object, the second object would be a deep partial of the default object.
- - Mocking and testing complex entities, where populating an entire object with its keys would be redundant in terms of the mock or test.
- @example
- ```
- import {PartialDeep} from 'type-fest';
- const settings: Settings = {
- textEditor: {
- fontSize: 14;
- fontColor: '#000000';
- fontWeight: 400;
- }
- autocomplete: false;
- autosave: true;
- };
- const applySavedSettings = (savedSettings: PartialDeep<Settings>) => {
- return {...settings, ...savedSettings};
- }
- settings = applySavedSettings({textEditor: {fontWeight: 500}});
- ```
- */
- export type PartialDeep<T> = T extends Primitive
- ? Partial<T>
- : T extends Map<infer KeyType, infer ValueType>
- ? PartialMapDeep<KeyType, ValueType>
- : T extends Set<infer ItemType>
- ? PartialSetDeep<ItemType>
- : T extends ReadonlyMap<infer KeyType, infer ValueType>
- ? PartialReadonlyMapDeep<KeyType, ValueType>
- : T extends ReadonlySet<infer ItemType>
- ? PartialReadonlySetDeep<ItemType>
- : T extends ((...arguments: any[]) => unknown)
- ? T | undefined
- : T extends object
- ? PartialObjectDeep<T>
- : unknown;
- /**
- Same as `PartialDeep`, but accepts only `Map`s and as inputs. Internal helper for `PartialDeep`.
- */
- interface PartialMapDeep<KeyType, ValueType> extends Map<PartialDeep<KeyType>, PartialDeep<ValueType>> {}
- /**
- Same as `PartialDeep`, but accepts only `Set`s as inputs. Internal helper for `PartialDeep`.
- */
- interface PartialSetDeep<T> extends Set<PartialDeep<T>> {}
- /**
- Same as `PartialDeep`, but accepts only `ReadonlyMap`s as inputs. Internal helper for `PartialDeep`.
- */
- interface PartialReadonlyMapDeep<KeyType, ValueType> extends ReadonlyMap<PartialDeep<KeyType>, PartialDeep<ValueType>> {}
- /**
- Same as `PartialDeep`, but accepts only `ReadonlySet`s as inputs. Internal helper for `PartialDeep`.
- */
- interface PartialReadonlySetDeep<T> extends ReadonlySet<PartialDeep<T>> {}
- /**
- Same as `PartialDeep`, but accepts only `object`s as inputs. Internal helper for `PartialDeep`.
- */
- type PartialObjectDeep<ObjectType extends object> = {
- [KeyType in keyof ObjectType]?: PartialDeep<ObjectType[KeyType]>
- };
|