| 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]> |
| }; |