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