@flex-development/tutils
Version:
TypeScript utilities
38 lines (37 loc) • 2.53 kB
text/typescript
/**
* @file Type Definitions - DeepOmit
* @module tutils/types/DeepOmit
*/
import type BuiltIn from './built-in.mjs';
import type KeysOptional from './keys-optional.mjs';
import type KeysRequired from './keys-required.mjs';
import type ObjectPlain from './object-plain.mjs';
import type OmitByType from './omit-by-type.mjs';
/**
* Omits properties of `T` using filter object `F`.
*
* @see https://github.com/krzkaczor/ts-essentials#DeepOmit
*
* @template T - Object type
* @template F - Filter object
*/
declare type DeepOmit<T extends DeepOmitHelper<F>, F extends ObjectPlain> = T extends BuiltIn ? T : T extends Map<infer KeyType, infer ValueType> ? ValueType extends DeepOmitHelper<F> ? Map<KeyType, DeepOmit<ValueType, F>> : T : T extends ReadonlyMap<infer KeyType, infer ValueType> ? ValueType extends DeepOmitHelper<F> ? ReadonlyMap<KeyType, DeepOmit<ValueType, F>> : T : T extends WeakMap<infer KeyType, infer ValueType> ? ValueType extends DeepOmitHelper<F> ? WeakMap<KeyType, DeepOmit<ValueType, F>> : T : T extends Set<infer ItemType> ? ItemType extends DeepOmitHelper<F> ? Set<DeepOmit<ItemType, F>> : T : T extends ReadonlySet<infer ItemType> ? ItemType extends DeepOmitHelper<F> ? ReadonlySet<DeepOmit<ItemType, F>> : T : T extends WeakSet<infer ItemType> ? ItemType extends DeepOmitHelper<F> ? WeakSet<DeepOmit<ItemType, F>> : T : T extends (infer ItemType)[] ? ItemType extends DeepOmitHelper<F> ? DeepOmit<ItemType, F>[] : T : T extends Promise<infer ItemType> ? ItemType extends DeepOmitHelper<F> ? Promise<DeepOmit<ItemType, F>> : T : {
[K in Exclude<KeysOptional<T>, keyof F>]+?: T[K];
} & OmitByType<{
[K in Extract<KeysOptional<T>, keyof F>]+?: F[K] extends true ? never : T[K] extends DeepOmitHelper<F[K]> ? DeepOmit<T[K], F[K]> : T[K];
}, never> & {
[K in Exclude<KeysRequired<T>, keyof F>]: T[K];
} & OmitByType<{
[K in Extract<KeysRequired<T>, keyof F>]: F[K] extends true ? never : T[K] extends DeepOmitHelper<F[K]> ? DeepOmit<T[K], F[K]> : T[K];
}, never>;
/**
* Helper for `DeepOmit`.
*
* @see https://github.com/krzkaczor/ts-essentials/blob/master/lib/types.ts
*
* @template T - Object type
*/
declare type DeepOmitHelper<T> = DeepOmitHelper<T>[] | Map<any, DeepOmitHelper<T>> | Promise<DeepOmitHelper<T>> | ReadonlySet<DeepOmitHelper<T>> | Set<DeepOmitHelper<T>> | WeakMap<any, DeepOmitHelper<T>> | WeakSet<DeepOmitHelper<T>> | {
[K in keyof T]: T[K] extends never ? any : T[K] extends object ? DeepOmitHelper<T[K]> : never;
};
export { type DeepOmit as default };