Type Alias HasNestedKey<T, P>

HasNestedKey: T extends { [key: string]: unknown }
    ? IfNever<
        keyof {
            [K in keyof T as K extends P
                ? K
                : HasNestedKey<T[K], P> extends true ? K : never]: never
        },
        false,
        true,
    >
    : T extends (infer U)[] ? HasNestedKey<U, P> : false

Return whether T or any record nested therein contains the key K

Type Parameters

  • T
  • P extends string
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, 'a'>; // true
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, 'b'>; // true
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, 'c'>; // true
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, 'd'>; // true
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, 'e'>; // false
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, 'd' | 'e'>; // true
HasNestedKey<{ a: string; b: { c: { d: number }[] } }, string>; // true