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
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'>