Effect CommunityEC
Effect Community2y ago
5 replies
addamsson

Defining a Schema for Required JSON Values in TypeScript

I have a schema that represents a valid JSON (without
null
or
undefined
):
import * as S from "@effect/schema/Schema";

export type RequiredJsonPrimitive = string | number | boolean;

export const RequiredJsonPrimitive = S.union(S.string, S.number, S.boolean);

export type RequiredJsonArray =
    | RequiredJsonValue[]
    | readonly RequiredJsonValue[];

export type RequiredJsonObject = { [Key in string]: RequiredJsonValue };

export type RequiredJsonValue =
    | RequiredJsonPrimitive
    | RequiredJsonObject
    | RequiredJsonArray;

export const RequiredJsonValue: S.Schema<RequiredJsonValue> = S.union(
    RequiredJsonPrimitive,
    S.array(S.suspend(() => RequiredJsonValue)),
    S.record(
        S.string,
        S.suspend(() => RequiredJsonValue),
    ),
);

export const RequiredJsonArray = S.array(S.suspend(() => RequiredJsonValue));

export const RequiredJsonObject: S.Schema<RequiredJsonObject> = S.record(
    S.string,
    S.suspend(() => RequiredJsonValue),
);

I tried to use this with an invalid value:

const result = S.decodeUnknownSync(RequiredJsonObject)({
    foo: new Date()
});

console.log(JSON.stringify(result));

and to my surprise the output was:
{"foo":{}}

what am I doing wrong?
Was this page helpful?