Recipes
›
Chapter 8: Helper Types
Using type-fest
Recipe 8.7 from
The TypeScript Cookbook
export type PartialDeep<T, Opts extends PartialDeepOptions = {}> =
T extends BuiltIns
? T
: T extends Map<infer KeyType, infer ValueType>
? PartialMapDeep<KeyType, ValueType, Opts>
: T extends Set<infer ItemType>
? PartialSetDeep<ItemType, Opts>
: T extends ReadonlyMap<infer KeyType, infer ValueType>
? PartialReadonlyMapDeep<KeyType, ValueType, Opts>
: T extends ReadonlySet<infer ItemType>
? PartialReadonlySetDeep<ItemType, Opts>
: T extends ((...arguments: any[]) => unknown)
? T | undefined
: T extends object
? T extends ReadonlyArray<infer ItemType>
? Opts['recurseIntoArrays'] extends true
? ItemType[] extends T
? readonly ItemType[] extends T
? ReadonlyArray<PartialDeep<ItemType | undefined, Opts>>
: Array<PartialDeep<ItemType | undefined, Opts>>
: PartialObjectDeep<T, Opts>
: T
: PartialObjectDeep<T, Opts>
: unknown;
type PartialMapDeep<KeyType, ValueType, Options extends PartialDeepOptions> =
{} & Map<PartialDeep<KeyType, Options>, PartialDeep<ValueType, Options>>;
type PartialSetDeep<T, Options extends PartialDeepOptions> =
{} & Set<PartialDeep<T, Options>>;
type PartialReadonlyMapDeep<
KeyType, ValueType,
Options extends PartialDeepOptions
> = {} & ReadonlyMap<
PartialDeep<KeyType, Options>,
PartialDeep<ValueType, Options>
>;
type PartialReadonlySetDeep<T, Options extends PartialDeepOptions> =
{} & ReadonlySet<PartialDeep<T, Options>>;
type PartialObjectDeep<
ObjectType extends object,
Options extends PartialDeepOptions
> = {
[KeyType in keyof ObjectType]?: PartialDeep<ObjectType[KeyType], Options>
};