# JsonifyWithCirculars

`type` in `utils` · v0.7.0

<https://docs.seedcord.org/packages/utils/0.7.0/types/jsonify-with-circulars>

JSONify an arbitrary type while allowing any object position to be replaced by a circular marker. Optional keys stay optional.

## Declaration

```ts
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;
```
