vtils

Home > types > OmitDeep

OmitDeep type

Recursively omit deep properties

Signature:

export declare type OmitDeep<T extends DeepOmitModify<Filter>, Filter> = T extends Builtin
? T
: T extends Map<infer KeyType, infer ValueType>
? ValueType extends DeepOmitModify<Filter>
? Map<KeyType, OmitDeep<ValueType, Filter>>
: T
: T extends ReadonlyMap<infer KeyType, infer ValueType>
? ValueType extends DeepOmitModify<Filter>
? ReadonlyMap<KeyType, OmitDeep<ValueType, Filter>>
: T
: T extends WeakMap<infer KeyType, infer ValueType>
? ValueType extends DeepOmitModify<Filter>
? WeakMap<KeyType, OmitDeep<ValueType, Filter>>
: T
: T extends Set<infer ItemType>
? ItemType extends DeepOmitModify<Filter>
? Set<OmitDeep<ItemType, Filter>>
: T
: T extends ReadonlySet<infer ItemType>
? ItemType extends DeepOmitModify<Filter>
? ReadonlySet<OmitDeep<ItemType, Filter>>
: T
: T extends WeakSet<infer ItemType>
? ItemType extends DeepOmitModify<Filter>
? WeakSet<OmitDeep<ItemType, Filter>>
: T
: T extends Array<infer ItemType>
? ItemType extends DeepOmitModify<Filter>
? Array<OmitDeep<ItemType, Filter>>
: T
: T extends Promise<infer ItemType>
? ItemType extends DeepOmitModify<Filter>
? Promise<OmitDeep<ItemType, Filter>>
: T
: {
    [K in Exclude<OptionalKeys<T>, keyof Filter>]+?: T[K];
} &
OmitBy<
    {
    [K in Extract<OptionalKeys<T>, keyof Filter>]+?: Filter[K] extends true
    ? never
    : T[K] extends DeepOmitModify<Filter[K]>
    ? OmitDeep<T[K], Filter[K]>
    : T[K];
},
never
> &
    {
    [K in Exclude<RequiredKeys<T>, keyof Filter>]: T[K];
} &
OmitBy<
    {
    [K in Extract<RequiredKeys<T>, keyof Filter>]: Filter[K] extends true
    ? never
    : T[K] extends DeepOmitModify<Filter[K]>
    ? OmitDeep<T[K], Filter[K]>
    : T[K];
},
never
>;

References: OmitDeep, OptionalKeys, OmitBy, RequiredKeys