Skip to content

Latest commit

 

History

History
86 lines (76 loc) · 2.35 KB

File metadata and controls

86 lines (76 loc) · 2.35 KB

Home > types-kit > DeepOmit

DeepOmit type

Remove the deep value path from T.

Signature:

export type DeepOmit<T, K extends DeepKeys<T>> = IsNever<
  Extract<K, Keys<T>>
> extends true
  ? {
      [P in keyof T]: [Exclude<K, Keys<T>>] extends [
        `${infer Head}.${infer Tail}`,
      ]
        ? P extends Head
          ? T[P] extends infer V
            ? V extends V
              ? IsObject<V> extends true
                ? DeepOmit<
                    V,
                    Extract<
                      Tail extends Tail
                        ? `${P}.${Tail}` extends K
                          ? Tail
                          : never
                        : never,
                      DeepKeys<V>
                    >
                  >
                : V
              : never
            : never
          : T[P]
        : never
    }
  : {
      [P in keyof T as P extends OtherToString<K>
        ? never
        : P extends Keys<T>
        ? P
        : never]: [Exclude<K, Keys<T>>] extends [`${infer Head}.${infer Tail}`]
        ? P extends Head
          ? T[P] extends infer V
            ? V extends V
              ? IsObject<V> extends true
                ? DeepOmit<
                    V,
                    Extract<
                      Tail extends Tail
                        ? `${P}.${Tail}` extends K
                          ? Tail
                          : never
                        : never,
                      DeepKeys<V>
                    >
                  >
                : V
              : never
            : never
          : T[P]
        : never
    }

References: DeepKeys, IsNever, Keys, IsObject, DeepOmit, OtherToString

Example

 interface Props {
      a?: {
        c: boolean
        d: () => void
        e: number
      }
      b: string
    }

 // Expect: { a?: { e: number }, b: string }
 type PropValues = DeepOmit<Props, 'a.c' | 'a.d'>