ts-gems 3.12.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
- import { IfNever } from './type-check.js';
2
+ import { IfNever, IfTuple } from './type-check.js';
3
3
 
4
4
  /**
5
5
  * OmitNever<T> is a type that omits all properties with a value of type "never".
@@ -30,25 +30,31 @@ export type OmitNever<T> = {
30
30
  export type DeepOmitNever<T> = {
31
31
  [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: IfNoDeepValue<
32
32
  // Do not deep process No-Deep values
33
- NonNullable<T[K]>
33
+ Exclude<T[K], undefined>
34
34
  > extends true
35
35
  ? T[K]
36
- : // Deep process objects
37
- DeepOmitNever<NonNullable<T[K]>>;
36
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
37
+ DeepOmitNever<Exclude<T[K], undefined>>;
38
38
  };
39
39
 
40
40
  /**
41
41
  * Omit all "never" and "undefined" properties in T deeply including arrays
42
42
  */
43
43
  export type DeeperOmitNever<T> = {
44
- [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: NonNullable<
45
- // Deep process arrays
46
- T[K]
47
- > extends (infer U)[]
48
- ? DeeperOmitNever<U>[]
49
- : // Do not deep process No-Deep values
50
- IfNoDeepValue<NonNullable<T[K]>> extends true
51
- ? T[K]
52
- : // Deep process objects
53
- DeeperOmitNever<NonNullable<T[K]>>;
44
+ [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: IfTuple<
45
+ NonNullable<T[K]>
46
+ > extends true // Leave fixed-length tuples untouched
47
+ ? T[K]
48
+ : NonNullable<
49
+ // Deep process arrays
50
+ T[K]
51
+ > extends readonly (infer U)[]
52
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
53
+ ? DeeperOmitNever<U>[] | null
54
+ : DeeperOmitNever<U>[]
55
+ : // Do not deep process No-Deep values
56
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
57
+ ? T[K]
58
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
59
+ DeeperOmitNever<Exclude<T[K], undefined>>;
54
60
  };
@@ -1,5 +1,5 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
- import { IfNever } from './type-check.js';
2
+ import { IfNever, IfTuple } from './type-check.js';
3
3
 
4
4
  /**
5
5
  * OmitUndefined<T> is a type that omits all properties with a value of type "undefined".
@@ -25,13 +25,17 @@ export type DeepOmitUndefined<T> = {
25
25
  * Omit all "never" and "undefined" properties in T deeply including arrays
26
26
  */
27
27
  export type DeeperOmitUndefined<T> = {
28
- [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: NonNullable<
29
- T[K]
30
- > extends (infer U)[] // Deep process arrays
31
- ? DeeperOmitUndefined<U>[]
32
- : // Do not deep process No-Deep values
33
- IfNoDeepValue<NonNullable<T[K]>> extends true
34
- ? T[K]
35
- : // Deep process objects
36
- DeeperOmitUndefined<NonNullable<T[K]>>;
28
+ [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: IfTuple<
29
+ NonNullable<T[K]>
30
+ > extends true // Leave fixed-length tuples untouched
31
+ ? T[K]
32
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
33
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
34
+ ? DeeperOmitUndefined<U>[] | null
35
+ : DeeperOmitUndefined<U>[]
36
+ : // Do not deep process No-Deep values
37
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
38
+ ? T[K]
39
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
40
+ DeeperOmitUndefined<Exclude<T[K], undefined>>;
37
41
  };
package/lib/omit.d.ts CHANGED
@@ -1,27 +1,38 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
2
  import { Or } from './logical.js';
3
- import { IfFunction, IfNever } from './type-check.js';
3
+ import { IfFunction, IfNever, IfTuple } from './type-check.js';
4
4
 
5
5
  /**
6
6
  * Construct a type with the properties of T except for those in type K,
7
7
  * while preserving strict type checking.
8
8
  */
9
9
  export type StrictOmit<T, X extends keyof T> = {
10
- [K in keyof T as K extends X ? never : K]: T[K];
10
+ [
11
+ K in keyof T as Or<
12
+ // Omit never keys
13
+ IfNever<Exclude<T[K], undefined>>,
14
+ // Omit X
15
+ K extends X ? true : false
16
+ > extends true
17
+ ? never
18
+ : K
19
+ ]: T[K];
11
20
  };
12
21
 
13
22
  /**
14
23
  * Omit all function properties in T
15
24
  */
16
25
  export type OmitFunctions<T> = {
17
- [K in keyof T as Or<
18
- // Omit never keys
19
- IfNever<Exclude<T[K], undefined>>,
20
- // Omit functions
21
- IfFunction<NonNullable<T[K]>>
22
- > extends true
23
- ? never
24
- : K]: T[K];
26
+ [
27
+ K in keyof T as Or<
28
+ // Omit never keys
29
+ IfNever<Exclude<T[K], undefined>>,
30
+ // Omit functions
31
+ IfFunction<NonNullable<T[K]>>
32
+ > extends true
33
+ ? never
34
+ : K
35
+ ]: T[K];
25
36
  };
26
37
 
27
38
  /**
@@ -38,31 +49,31 @@ export type OmitTypes<T, X> = {
38
49
  * Omit all function properties in T
39
50
  */
40
51
  export type DeepOmitTypes<T, X> = {
41
- [K in keyof T as IfNever<
42
- Exclude<T[K], undefined | X>,
43
- never,
44
- K
45
- >]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
52
+ [
53
+ K in keyof T as IfNever<Exclude<T[K], undefined | X>, never, K>
54
+ ]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
46
55
  ? Exclude<T[K], X>
47
- : // Deep process objects
48
- DeepOmitTypes<NonNullable<T[K]>, X>;
56
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
57
+ DeepOmitTypes<Exclude<T[K], undefined>, X>;
49
58
  };
50
59
 
51
60
  /**
52
61
  * Omit all function properties in T deeply including arrays
53
62
  */
54
63
  export type DeeperOmitTypes<T, X> = {
55
- [K in keyof T as IfNever<
56
- Exclude<T[K], undefined | X>,
57
- never,
58
- K
59
- >]: NonNullable<
60
- // Deep process arrays // Do not deep process No-Deep values
61
- T[K]
62
- > extends (infer U)[]
63
- ? DeeperOmitTypes<U, X>[]
64
- : IfNoDeepValue<NonNullable<T[K]>> extends true
65
- ? Exclude<T[K], X>
66
- : // Deep process objects
67
- DeeperOmitTypes<NonNullable<T[K]>, X>;
64
+ [K in keyof T as IfNever<Exclude<T[K], undefined | X>, never, K>]: IfTuple<
65
+ NonNullable<T[K]>
66
+ > extends true // Leave fixed-length tuples untouched
67
+ ? Exclude<T[K], X>
68
+ : NonNullable<
69
+ // Deep process arrays // Do not deep process No-Deep values
70
+ T[K]
71
+ > extends readonly (infer U)[]
72
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
73
+ ? DeeperOmitTypes<U, X>[] | null
74
+ : DeeperOmitTypes<U, X>[]
75
+ : IfNoDeepValue<Exclude<T[K], undefined>> extends true
76
+ ? Exclude<T[K], X>
77
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
78
+ DeeperOmitTypes<Exclude<T[K], undefined>, X>;
68
79
  };
package/lib/partial.d.ts CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  OmitRequired,
8
8
  PickRequired,
9
9
  } from './required.js';
10
- import { IfNever } from './type-check.js';
10
+ import { IfNever, IfTuple } from './type-check.js';
11
11
 
12
12
  /**
13
13
  * Marks given keys as optional
@@ -24,24 +24,27 @@ export type DeepPartial<T> = {
24
24
  Exclude<T[K], undefined>
25
25
  > extends true
26
26
  ? T[K]
27
- : // Deep process objects
28
- DeepPartial<NonNullable<T[K]>>;
27
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
28
+ DeepPartial<Exclude<T[K], undefined>>;
29
29
  };
30
30
 
31
31
  /**
32
32
  * Partial but deeply including arrays
33
33
  */
34
34
  export type DeeperPartial<T> = {
35
- [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]?: NonNullable<
36
- // Deep process arrays
37
- T[K]
38
- > extends (infer U)[]
39
- ? DeeperPartial<U>[]
40
- : // Do not deep process No-Deep values
41
- IfNoDeepValue<NonNullable<T[K]>> extends true
42
- ? T[K]
43
- : // Deep process objects
44
- DeeperPartial<NonNullable<T[K]>>;
35
+ [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]?: IfTuple<
36
+ NonNullable<T[K]>
37
+ > extends true // Leave fixed-length tuples untouched
38
+ ? T[K]
39
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
40
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
41
+ ? DeeperPartial<U>[] | null
42
+ : DeeperPartial<U>[]
43
+ : // Do not deep process No-Deep values
44
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
45
+ ? T[K]
46
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
47
+ DeeperPartial<Exclude<T[K], undefined>>;
45
48
  };
46
49
 
47
50
  /**
package/lib/pick.d.ts CHANGED
@@ -13,62 +13,70 @@ import {
13
13
  * while preserving strict type checking.
14
14
  */
15
15
  export type StrictPick<T, X extends keyof T> = {
16
- [K in keyof T as Or<
17
- // Omit never keys
18
- IfNever<Exclude<T[K], undefined>>,
19
- // Omit X
20
- K extends X ? false : true
21
- > extends true
22
- ? never
23
- : K]: T[K];
16
+ [
17
+ K in keyof T as Or<
18
+ // Omit never keys
19
+ IfNever<Exclude<T[K], undefined>>,
20
+ // Omit X
21
+ K extends X ? false : true
22
+ > extends true
23
+ ? never
24
+ : K
25
+ ]: T[K];
24
26
  };
25
27
 
26
28
  /**
27
29
  * Pick all function properties in T
28
30
  */
29
31
  export type PickFunctions<T> = {
30
- [K in keyof T as Or<
31
- // Omit never keys
32
- IfNever<Exclude<T[K], undefined>>,
33
- // Omit non functions
34
- IfFunction<NonNullable<T[K]>, false, true>
35
- > extends true
36
- ? never
37
- : K]: T[K];
32
+ [
33
+ K in keyof T as Or<
34
+ // Omit never keys
35
+ IfNever<Exclude<T[K], undefined>>,
36
+ // Omit non functions
37
+ IfFunction<NonNullable<T[K]>, false, true>
38
+ > extends true
39
+ ? never
40
+ : K
41
+ ]: T[K];
38
42
  };
39
43
 
40
44
  /**
41
45
  * Pick all function properties in T
42
46
  */
43
47
  export type PickTypes<T, X> = {
44
- [K in keyof T as Or<
45
- // Omit never keys
46
- IfNever<Exclude<T[K], undefined>>,
47
- // Omit types which not exists in X
48
- T[K] extends X ? false : X extends T[K] ? false : true
49
- > extends true
50
- ? never
51
- : K]: T[K];
48
+ [
49
+ K in keyof T as Or<
50
+ // Omit never keys
51
+ IfNever<Exclude<T[K], undefined>>,
52
+ // Omit types which not exists in X
53
+ T[K] extends X ? false : X extends T[K] ? false : true
54
+ > extends true
55
+ ? never
56
+ : K
57
+ ]: T[K];
52
58
  };
53
59
 
54
60
  /**
55
61
  * Pick all function properties in T
56
62
  */
57
63
  export type StrictPickTypes<T, X> = {
58
- [K in keyof T as Or<
59
- // Omit never keys
60
- IfNever<Exclude<T[K], undefined>>,
61
- // Omit unknown
62
- IfUnknown<T[K]>,
63
- // Omit any
64
- IfAny<T[K]>,
65
- // Omit {}
66
- IfEmptyObject<T[K]>,
67
- // Omit types which not exists in X
68
- T[K] extends X ? false : X extends T[K] ? false : true
69
- > extends true
70
- ? never
71
- : K]: T[K];
64
+ [
65
+ K in keyof T as Or<
66
+ // Omit never keys
67
+ IfNever<Exclude<T[K], undefined>>,
68
+ // Omit unknown
69
+ IfUnknown<T[K]>,
70
+ // Omit any
71
+ IfAny<T[K]>,
72
+ // Omit {}
73
+ IfEmptyObject<T[K]>,
74
+ // Omit types which not exists in X
75
+ T[K] extends X ? false : X extends T[K] ? false : true
76
+ > extends true
77
+ ? never
78
+ : K
79
+ ]: T[K];
72
80
  };
73
81
 
74
82
  /**
package/lib/readonly.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
2
  import { Or } from './logical.js';
3
- import { IfEquals, IfNever } from './type-check.js';
3
+ import { IfEquals, IfNever, IfTuple } from './type-check.js';
4
4
 
5
5
  /**
6
6
  * Marks given keys as readonly
@@ -12,11 +12,9 @@ export type ReadonlySome<T, K extends keyof T> = Readonly<Pick<T, K>> &
12
12
  * Make all properties in T readonly deeply
13
13
  */
14
14
  export type DeepReadonly<T> = {
15
- readonly [K in keyof T as IfNever<
16
- Exclude<T[K], undefined>,
17
- never,
18
- K
19
- >]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
15
+ readonly [
16
+ K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>
17
+ ]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
20
18
  ? T[K]
21
19
  : // Deep process objects
22
20
  DeepReadonly<Exclude<T[K], undefined>>;
@@ -26,17 +24,19 @@ export type DeepReadonly<T> = {
26
24
  * Make all properties in T readonly deeply
27
25
  */
28
26
  export type DeeperReadonly<T> = {
29
- readonly [K in keyof T as IfNever<
30
- Exclude<T[K], undefined>,
31
- never,
32
- K
33
- >]: NonNullable<T[K]> extends (infer U)[] // Deep process arrays
34
- ? DeeperReadonly<U>[]
35
- : // Do not deep process No-Deep values
36
- IfNoDeepValue<Exclude<T[K], undefined>> extends true
37
- ? T[K]
38
- : // Deep process objects
39
- DeeperReadonly<Exclude<T[K], undefined>>;
27
+ readonly [
28
+ K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>
29
+ ]: IfTuple<NonNullable<T[K]>> extends true // Leave fixed-length tuples untouched
30
+ ? T[K]
31
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
32
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
33
+ ? DeeperReadonly<U>[] | null
34
+ : DeeperReadonly<U>[]
35
+ : // Do not deep process No-Deep values
36
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
37
+ ? T[K]
38
+ : // Deep process objects
39
+ DeeperReadonly<Exclude<T[K], undefined>>;
40
40
  };
41
41
 
42
42
  /**
@@ -48,100 +48,120 @@ export type ReadonlyKeys<T> = keyof PickReadonly<T>;
48
48
  * Pick all readonly properties in T
49
49
  */
50
50
  export type PickReadonly<T> = {
51
- [K in keyof T as Or<
52
- // Omit never keys
53
- IfNever<Exclude<T[K], undefined>>,
54
- // Omit required
55
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
56
- > extends true
57
- ? never
58
- : K]: T[K];
51
+ [
52
+ K in keyof T as Or<
53
+ // Omit never keys
54
+ IfNever<Exclude<T[K], undefined>>,
55
+ // Omit required
56
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
57
+ > extends true
58
+ ? never
59
+ : K
60
+ ]: T[K];
59
61
  };
60
62
 
61
63
  /**
62
64
  * Omit all readonly properties in T
63
65
  */
64
66
  export type OmitReadonly<T> = {
65
- [K in keyof T as Or<
66
- // Omit never keys
67
- IfNever<Exclude<T[K], undefined>>,
68
- // Omit required
69
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
70
- > extends true
71
- ? never
72
- : K]: T[K];
67
+ [
68
+ K in keyof T as Or<
69
+ // Omit never keys
70
+ IfNever<Exclude<T[K], undefined>>,
71
+ // Omit required
72
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
73
+ > extends true
74
+ ? never
75
+ : K
76
+ ]: T[K];
73
77
  };
74
78
 
75
79
  /**
76
80
  * Pick all readonly properties in T deeply
77
81
  */
78
82
  export type DeepPickReadonly<T> = {
79
- [K in keyof T as Or<
80
- // Omit never keys
81
- IfNever<Exclude<T[K], undefined>>,
82
- // Omit required
83
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
84
- > extends true
85
- ? never
86
- : K]: IfNoDeepValue<NonNullable<T[K]>> extends true // Do not deep process No-Deep values
83
+ [
84
+ K in keyof T as Or<
85
+ // Omit never keys
86
+ IfNever<Exclude<T[K], undefined>>,
87
+ // Omit required
88
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
89
+ > extends true
90
+ ? never
91
+ : K
92
+ ]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
87
93
  ? T[K]
88
- : // Deep process objects
89
- DeepPickReadonly<NonNullable<T[K]>>;
94
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
95
+ DeepPickReadonly<Exclude<T[K], undefined>>;
90
96
  };
91
97
 
92
98
  /**
93
99
  * Pick all readonly properties in T deeply
94
100
  */
95
101
  export type DeepOmitReadonly<T> = {
96
- [K in keyof T as Or<
97
- // Omit never keys
98
- IfNever<NonNullable<T[K]>>,
99
- // Omit required
100
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
101
- > extends true
102
- ? never
103
- : K]: IfNoDeepValue<NonNullable<T[K]>> extends true // Do not deep process No-Deep values
102
+ [
103
+ K in keyof T as Or<
104
+ // Omit never keys
105
+ IfNever<Exclude<T[K], undefined>>,
106
+ // Omit required
107
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
108
+ > extends true
109
+ ? never
110
+ : K
111
+ ]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
104
112
  ? T[K]
105
- : // Deep process objects
106
- DeepOmitReadonly<NonNullable<T[K]>>;
113
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
114
+ DeepOmitReadonly<Exclude<T[K], undefined>>;
107
115
  };
108
116
 
109
117
  /**
110
118
  * Pick all readonly properties in T deeply including arrays
111
119
  */
112
120
  export type DeeperPickReadonly<T> = {
113
- [K in keyof T as Or<
114
- // Omit never keys
115
- IfNever<Exclude<T[K], undefined>>,
116
- // Omit required
117
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
118
- > extends true
119
- ? never
120
- : K]: NonNullable<T[K]> extends (infer U)[] // Deep process arrays
121
- ? DeeperPickReadonly<U>[]
122
- : // Do not deep process No-Deep values
123
- IfNoDeepValue<NonNullable<T[K]>> extends true
124
- ? T[K]
125
- : // Deep process objects
126
- DeeperPickReadonly<NonNullable<T[K]>>;
121
+ [
122
+ K in keyof T as Or<
123
+ // Omit never keys
124
+ IfNever<Exclude<T[K], undefined>>,
125
+ // Omit required
126
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
127
+ > extends true
128
+ ? never
129
+ : K
130
+ ]: IfTuple<NonNullable<T[K]>> extends true // Leave fixed-length tuples untouched
131
+ ? T[K]
132
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
133
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
134
+ ? DeeperPickReadonly<U>[] | null
135
+ : DeeperPickReadonly<U>[]
136
+ : // Do not deep process No-Deep values
137
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
138
+ ? T[K]
139
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
140
+ DeeperPickReadonly<Exclude<T[K], undefined>>;
127
141
  };
128
142
 
129
143
  /**
130
144
  * Pick all readonly properties in T deeply including arrays
131
145
  */
132
146
  export type DeeperOmitReadonly<T> = {
133
- [K in keyof T as Or<
134
- // Omit never keys
135
- IfNever<Exclude<T[K], undefined>>,
136
- // Omit required
137
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
138
- > extends true
139
- ? never
140
- : K]: NonNullable<T[K]> extends (infer U)[] // Deep process arrays
141
- ? DeeperOmitReadonly<U>[]
142
- : // Do not deep process No-Deep values
143
- IfNoDeepValue<NonNullable<T[K]>> extends true
144
- ? T[K]
145
- : // Deep process objects
146
- DeeperOmitReadonly<NonNullable<T[K]>>;
147
+ [
148
+ K in keyof T as Or<
149
+ // Omit never keys
150
+ IfNever<Exclude<T[K], undefined>>,
151
+ // Omit required
152
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
153
+ > extends true
154
+ ? never
155
+ : K
156
+ ]: IfTuple<NonNullable<T[K]>> extends true // Leave fixed-length tuples untouched
157
+ ? T[K]
158
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
159
+ ? null extends T[K] // Preserve a `| null` member lost by NonNullable above
160
+ ? DeeperOmitReadonly<U>[] | null
161
+ : DeeperOmitReadonly<U>[]
162
+ : // Do not deep process No-Deep values
163
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
164
+ ? T[K]
165
+ : // Deep process objects (Exclude, not NonNullable - preserves a `| null` member)
166
+ DeeperOmitReadonly<Exclude<T[K], undefined>>;
147
167
  };