import { UnionMerge } from './UnionMerge.js'; import { S as Substract } from './chunks/CM89_aaq.js'; import './OmitNever.js'; import './Pretty.js'; import './Function.js'; import './BooleanNor.js'; import './BooleanNot.js'; import './BooleanOr.js'; import './Tuple.js'; import './chunks/DZEfmVOc.js'; import './BooleanAnd.js'; import './MaybeReadonly.js'; import './TupleLength.js'; /** * Make all nested `undefined` or `void` properties of T optional. This type is * similar to `Partial` but it only makes properties optional if they are * `undefined` or `void`. Meaning they non-`undefined` or non-`void` properties * will remain required. * * @template T The type to make optional * @template D The maximum depth to recurse to in T. This is to prevent infinite recursion and is set to `16` by default. * @returns A new type with all nested `undefined` or `void` properties of T optional * @example LooseDeep<{ a: { b: string | undefined, c: number } | undefined }> // { a?: { b?: string, c: number } } */ type LooseDeep = D extends 0 ? T : T extends object ? T extends Array ? Array>> : T extends ReadonlyArray ? ReadonlyArray>> : UnionMerge<{ [P in keyof T as undefined extends T[P] ? never : P]: LooseDeep>; } | { [P in keyof T as undefined extends T[P] ? P : never]?: LooseDeep>; }> : T; export type { LooseDeep };