Typeutilsv0.6.1
type JsonifyWithCirculars<
BaseType,
Marker extends string = "[Circular]"
> = BaseType extends JsonPrimitive
? BaseType
: BaseType extends bigint
? string
: BaseType extends Date
? string
: BaseType extends { toJSON(): infer J }
? unknown extends J
? JsonifyObject<BaseType, Marker>
: JsonifyWithCirculars<J, Marker>
: BaseType extends readonly (infer U)[]
? (JsonifyWithCirculars<U, Marker> | Marker)[]
: BaseType extends Map<infer K, infer V>
? [
JsonifyWithCirculars<K, Marker> | Marker,
JsonifyWithCirculars<V, Marker> | Marker
][]
: BaseType extends Set<infer U2>
? (JsonifyWithCirculars<U2, Marker> | Marker)[]
: BaseType extends (
...args: unknown[]
) => unknown
? never
: BaseType extends object
? JsonifyObject<BaseType, Marker>
: never;type JsonifyWithCirculars<
BaseType,
Marker extends string = "[Circular]"
> = BaseType extends JsonPrimitive
? BaseType
: BaseType extends bigint
? string
: BaseType extends Date
? string
: BaseType extends { toJSON(): infer J }
? unknown extends J
? JsonifyObject<BaseType, Marker>
: JsonifyWithCirculars<J, Marker>
: BaseType extends readonly (infer U)[]
? (JsonifyWithCirculars<U, Marker> | Marker)[]
: BaseType extends Map<infer K, infer V>
? [
JsonifyWithCirculars<K, Marker> | Marker,
JsonifyWithCirculars<V, Marker> | Marker
][]
: BaseType extends Set<infer U2>
? (JsonifyWithCirculars<U2, Marker> | Marker)[]
: BaseType extends (
...args: unknown[]
) => unknown
? never
: BaseType extends object
? JsonifyObject<BaseType, Marker>
: never;