import { IfNoDeepValue } from './helpers.js'; import { IfNever } from './type-check.js'; /** * OmitNever is a type that omits all properties with a value of type "never". * * @template T - The original type * * @example * type MyType = { * a: string; * b: number; * c?: never; * }; * * type Result = OmitNever; * // Result is: * // { * // a: string; * // b: number; * // } */ export type OmitNever = { [K in keyof T as IfNever, never, K>]: T[K]; }; /** * Omit all "never" and "undefined" properties in T deeply */ export type DeepOmitNever = { [K in keyof T as IfNever, never, K>]: IfNoDeepValue< // Do not deep process No-Deep values NonNullable > extends true ? T[K] : // Deep process objects DeepOmitNever>; }; /** * Omit all "never" and "undefined" properties in T deeply including arrays */ export type DeeperOmitNever = { [K in keyof T as IfNever, never, K>]: NonNullable< // Deep process arrays T[K] > extends (infer U)[] ? DeeperOmitNever[] : // Do not deep process No-Deep values IfNoDeepValue> extends true ? T[K] : // Deep process objects DeeperOmitNever>; };