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