Skip to content

Commit 9d85073

Browse files
committed
fix(zod): fixes type issues with zx.makeLens interacting poorly with zx.defaultValue
1 parent 12f9efc commit 9d85073

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

packages/zod/src/default-value.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,18 @@ export type DefaultTypeMap = {
8585
string: undefined
8686
}
8787

88+
export type PreserveTypeMap = {
89+
never: never
90+
any: any
91+
unknown: unknown
92+
undefined: undefined
93+
null: null | undefined
94+
boolean: boolean | undefined
95+
bigint: bigint | undefined
96+
number: number | undefined
97+
string: string | undefined
98+
}
99+
88100
export type AnyTypeMap = {
89101
never: unknown
90102
any: unknown
@@ -115,16 +127,6 @@ export type defaultValue<
115127
>
116128
: { [K in keyof T]: defaultValue<T[K], TypeMap, M> }
117129

118-
119-
// export type defaultValue<T, Fallback = undefined>
120-
// = T extends Primitive | Atom ? T | Fallback
121-
// : T extends Set<any> ? Set<defaultValue<ReturnType<(ReturnType<T['values']>['return'] & {})>['value'] & {}, Fallback>>
122-
// : T extends Map<any, any> ? Map<
123-
// defaultValue<({} & ReturnType<{} & ReturnType<T['entries']>['return']>['value'])[0], Fallback>,
124-
// defaultValue<({} & ReturnType<{} & ReturnType<T['entries']>['return']>['value'])[1], Fallback>
125-
// >
126-
// : { [K in keyof T]-?: defaultValue<T[K], Fallback> }
127-
128130
/**
129131
* ## {@link defaultValue `zx.defaultValue`}
130132
*

packages/zod/src/makeLens.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from 'zod'
2-
import type { Key, newtype, Showable } from '@traversable/registry'
2+
import type { Key, newtype, Primitive, Showable } from '@traversable/registry'
33
import {
44
Array_from,
55
Array_isArray,
@@ -532,9 +532,23 @@ interface Proxy_tuple<T, S, KS extends (keyof any)[]> extends newtype<
532532
[symbol.path]: KS
533533
}
534534

535+
export type Atom =
536+
| globalThis.Date
537+
| globalThis.RegExp
538+
539+
export type CoalesceOptional<T, Fallback = undefined>
540+
= T extends Primitive | Atom ? T | Fallback
541+
: T extends Set<any> ? Set<CoalesceOptional<ReturnType<(ReturnType<T['values']>['return'] & {})>['value'] & {}, Fallback>>
542+
: T extends Map<any, any> ? Map<
543+
CoalesceOptional<({} & ReturnType<{} & ReturnType<T['entries']>['return']>['value'])[0], Fallback>,
544+
CoalesceOptional<({} & ReturnType<{} & ReturnType<T['entries']>['return']>['value'])[1], Fallback>
545+
>
546+
: { [K in keyof T]-?: CoalesceOptional<T[K], Fallback> }
547+
535548
interface Proxy_optional<T, S, KS extends (keyof any)[]> {
536549
[DSL.chainOptional]: Proxy<S>
537-
[DSL.coalesceOptional]: Proxy<S, [defaultValue<S>], KS>
550+
// [DSL.coalesceOptional]: Proxy<S, [S], KS>
551+
[DSL.coalesceOptional]: Proxy<S, [CoalesceOptional<S>], KS>
538552
[symbol.type]: T
539553
[symbol.path]: KS
540554
}

0 commit comments

Comments
 (0)