import { IfNoDeepValue } from './helpers.js'; import { IfNever } from './type-check.js'; /** * OmitUndefined is a type that omits all properties with a value of type "undefined". */ export type OmitUndefined = { [K in keyof T as IfNever, never, K>]: T[K]; }; /** * Omit all "never" and "undefined" properties in T deeply */ export type DeepOmitUndefined = { [K in keyof T as IfNever, never, K>]: IfNoDeepValue< // Do not deep process No-Deep values Exclude > extends true ? T[K] : // Deep process objects DeepOmitUndefined>; }; /** * Omit all "never" and "undefined" properties in T deeply including arrays */ export type DeeperOmitUndefined = { [K in keyof T as IfNever, never, K>]: NonNullable< T[K] > extends (infer U)[] // Deep process arrays ? DeeperOmitUndefined[] : // Do not deep process No-Deep values IfNoDeepValue> extends true ? T[K] : // Deep process objects DeeperOmitUndefined>; };