You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.3 KiB
72 lines
2.3 KiB
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]> |
|
};
|
|
|