diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/any.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/any.schema/default/TopLevel.ts
index 59760da..b08b84f 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/any.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/any.schema/default/TopLevel.ts
@@ -1,7 +1,25 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "foo": S.Any,
-    "values": S.Record({ key: S.String, value: S.Any}),
+    "values": mapSchema(S.Any),
 }) {}
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/class-map-union.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/class-map-union.schema/default/TopLevel.ts
index 9541109..10a6489 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/class-map-union.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/class-map-union.schema/default/TopLevel.ts
@@ -1,10 +1,28 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class UnionClass extends S.Class<UnionClass>("UnionClass")({
     "quux": S.optional(S.Int),
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "union": S.optional(S.Record({ key: S.String, value: S.Union(S.Boolean, S.Number, S.String, UnionClass)})),
+    "union": S.optional(mapSchema(S.Union(S.Boolean, S.Number, S.String, UnionClass))),
 }) {}
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/class-with-additional.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/class-with-additional.schema/default/TopLevel.ts
index e29de2c..67f2423 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/class-with-additional.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/class-with-additional.schema/default/TopLevel.ts
@@ -1,6 +1,24 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "map": S.optional(S.Record({ key: S.String, value: S.Union(S.Boolean, S.Number)})),
+    "map": S.optional(mapSchema(S.Union(S.Boolean, S.Number))),
 }) {}
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/direct-union.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/direct-union.schema/default/TopLevel.ts
index ba1b7e6..b73d5e2 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/direct-union.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/direct-union.schema/default/TopLevel.ts
@@ -1,11 +1,29 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Thing extends S.Class<Thing>("Thing")({
-    "optional": S.optional(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.Int, S.Record({ key: S.String, value: S.Any}), S.String, S.Null)),
-    "required": S.Union(S.Array(S.Any), S.Boolean, S.Number, S.Int, S.Record({ key: S.String, value: S.Any}), S.String, S.Null),
+    "optional": S.optional(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.Int, mapSchema(S.Any), S.String, S.Null)),
+    "required": S.Union(S.Array(S.Any), S.Boolean, S.Number, S.Int, mapSchema(S.Any), S.String, S.Null),
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "stuff": S.Record({ key: S.String, value: Thing}),
+    "stuff": mapSchema(Thing),
 }) {}
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/empty-object.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/empty-object.schema/default/TopLevel.ts
index 79eaa1d..10e0061 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/empty-object.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/empty-object.schema/default/TopLevel.ts
@@ -1,4 +1,22 @@
 import * as S from "effect/Schema";
 
-export const TopLevel = S.Record({ key: S.String, value: S.Any});
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
+export const TopLevel = mapSchema(S.Any);
 export type TopLevel = S.Schema.Type<typeof TopLevel>;
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/go-schema-pattern-properties.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/go-schema-pattern-properties.schema/default/TopLevel.ts
index 5069fce..5574ecc 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/go-schema-pattern-properties.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/go-schema-pattern-properties.schema/default/TopLevel.ts
@@ -1,6 +1,24 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "map": S.Record({ key: S.String, value: S.Int}),
+    "map": mapSchema(S.Int),
 }) {}
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/recursive-union-flattening.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/recursive-union-flattening.schema/default/TopLevel.ts
index d4d744b..afb3bd6 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/recursive-union-flattening.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/recursive-union-flattening.schema/default/TopLevel.ts
@@ -1,13 +1,31 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class XClass extends S.Class<XClass>("XClass")({
-    "x": S.optional(S.Union(S.Array(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.String, S.suspend(() => XClass), S.Null)), S.Boolean, S.Number, S.Record({ key: S.String, value: S.Any}), S.String, S.Null)),
+    "x": S.optional(S.Union(S.Array(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.String, S.suspend(() => XClass), S.Null)), S.Boolean, S.Number, mapSchema(S.Any), S.String, S.Null)),
 }) {}
 
 export class TopLevelClass extends S.Class<TopLevelClass>("TopLevelClass")({
-    "x": S.optional(S.Union(S.Array(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.String, XClass, S.Null)), S.Boolean, S.Number, S.Record({ key: S.String, value: S.Any}), S.String, S.Null)),
+    "x": S.optional(S.Union(S.Array(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.String, XClass, S.Null)), S.Boolean, S.Number, mapSchema(S.Any), S.String, S.Null)),
 }) {}
 
-export const TopLevel = S.Union(S.Array(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.String, TopLevelClass, S.Null)), S.Boolean, S.Number, S.Int, S.Record({ key: S.String, value: S.Any}), S.String, S.Null);
+export const TopLevel = S.Union(S.Array(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.String, TopLevelClass, S.Null)), S.Boolean, S.Number, S.Int, mapSchema(S.Any), S.String, S.Null);
 export type TopLevel = S.Schema.Type<typeof TopLevel>;
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/unevaluated-properties.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/unevaluated-properties.schema/default/TopLevel.ts
index 44e46c9..aa53d66 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/unevaluated-properties.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/unevaluated-properties.schema/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Item extends S.Class<Item>("Item")({
     "key": S.String,
@@ -12,7 +30,7 @@ export class ClosedClass extends S.Class<ClosedClass>("ClosedClass")(S.Struct({}
 export class Config extends S.Class<Config>("Config")({
     "closed": S.optional(S.Union(S.Array(S.Any), S.Boolean, S.Number, S.Int, S.String, ClosedClass, S.Null)),
     "name": S.optional(S.String),
-    "settings": S.optional(S.Record({ key: S.String, value: S.Array(Item)})),
+    "settings": S.optional(mapSchema(S.Array(Item))),
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
diff --git a/base/schema-typescript-effect-schema/test/inputs/schema/vega-lite.schema/default/TopLevel.ts b/head/schema-typescript-effect-schema/test/inputs/schema/vega-lite.schema/default/TopLevel.ts
index 513d181..8a84b43 100644
--- a/base/schema-typescript-effect-schema/test/inputs/schema/vega-lite.schema/default/TopLevel.ts
+++ b/head/schema-typescript-effect-schema/test/inputs/schema/vega-lite.schema/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 // Determines how size calculation should be performed, one of `"content"` or `"padding"`.
 // The default setting (`"content"`) interprets the width and height settings as the data
 // rectangle (plotting) dimensions, to which padding is then added. In contrast, the
@@ -642,7 +660,7 @@ export class Projection extends S.Class<Projection>("Projection")({
     "fraction": S.optional(S.Number),
     "lobes": S.optional(S.Number),
     "parallel": S.optional(S.Number),
-    "precision": S.optional(S.Record({ key: S.String, value: S.Union(S.Number, S.String)})),
+    "precision": S.optional(mapSchema(S.Union(S.Number, S.String))),
     "radius": S.optional(S.Number),
     "ratio": S.optional(S.Number),
     "rotate": S.optional(S.Array(S.Number)),
@@ -789,7 +807,7 @@ export class Header extends S.Class<Header>("Header")({
 }) {}
 
 export class SelectionDef extends S.Class<SelectionDef>("SelectionDef")({
-    "bind": S.optional(S.Union(BindEnum, S.Record({ key: S.String, value: S.suspend(() => VgBinding)}))),
+    "bind": S.optional(S.Union(BindEnum, mapSchema(S.suspend(() => VgBinding)))),
     "empty": S.optional(Empty),
     "encodings": S.optional(S.Array(SingleDefChannel)),
     "fields": S.optional(S.Array(S.String)),
@@ -989,7 +1007,7 @@ export class EncodingWithFacet extends S.Class<EncodingWithFacet>("EncodingWithF
 }) {}
 
 export class DataFormat extends S.Class<DataFormat>("DataFormat")({
-    "parse": S.optional(S.Union(ParseEnum, S.Record({ key: S.String, value: S.Any}))),
+    "parse": S.optional(S.Union(ParseEnum, mapSchema(S.Any))),
     "type": S.optional(DataFormatType),
     "property": S.optional(S.String),
     "feature": S.optional(S.String),
@@ -999,7 +1017,7 @@ export class DataFormat extends S.Class<DataFormat>("DataFormat")({
 export class Data extends S.Class<Data>("Data")({
     "format": S.optional(DataFormat),
     "url": S.optional(S.String),
-    "values": S.optional(S.Union(S.Array(S.Union(S.Boolean, S.Number, S.Record({ key: S.String, value: S.Any}), S.String)), S.Record({ key: S.String, value: S.Any}), S.String)),
+    "values": S.optional(S.Union(S.Array(S.Union(S.Boolean, S.Number, mapSchema(S.Any), S.String)), mapSchema(S.Any), S.String)),
     "name": S.optional(S.String),
 }) {}
 
@@ -1139,7 +1157,7 @@ export class VgBinding extends S.Class<VgBinding>("VgBinding")({
 }) {}
 
 export class SingleSelectionConfig extends S.Class<SingleSelectionConfig>("SingleSelectionConfig")({
-    "bind": S.optional(S.Record({ key: S.String, value: VgBinding})),
+    "bind": S.optional(mapSchema(VgBinding)),
     "empty": S.optional(Empty),
     "encodings": S.optional(S.Array(SingleDefChannel)),
     "fields": S.optional(S.Array(S.String)),
@@ -1237,7 +1255,7 @@ export class ProjectionConfig extends S.Class<ProjectionConfig>("ProjectionConfi
     "fraction": S.optional(S.Number),
     "lobes": S.optional(S.Number),
     "parallel": S.optional(S.Number),
-    "precision": S.optional(S.Record({ key: S.String, value: S.Union(S.Number, S.String)})),
+    "precision": S.optional(mapSchema(S.Union(S.Number, S.String))),
     "radius": S.optional(S.Number),
     "ratio": S.optional(S.Number),
     "rotate": S.optional(S.Array(S.Number)),
@@ -1474,14 +1492,14 @@ export class Config extends S.Class<Config>("Config")({
     "padding": S.optional(S.Union(S.Number, PaddingClass)),
     "point": S.optional(MarkConfig),
     "projection": S.optional(ProjectionConfig),
-    "range": S.optional(S.Record({ key: S.String, value: S.Union(S.Array(S.Union(S.Number, S.String)), VgScheme)})),
+    "range": S.optional(mapSchema(S.Union(S.Array(S.Union(S.Number, S.String)), VgScheme))),
     "rect": S.optional(MarkConfig),
     "rule": S.optional(MarkConfig),
     "scale": S.optional(ScaleConfig),
     "selection": S.optional(SelectionConfig),
     "square": S.optional(MarkConfig),
     "stack": S.optional(StackOffset),
-    "style": S.optional(S.Record({ key: S.String, value: VgMarkConfig})),
+    "style": S.optional(mapSchema(VgMarkConfig)),
     "text": S.optional(TextConfig),
     "tick": S.optional(TickConfig),
     "timeFormat": S.optional(S.String),
@@ -1524,7 +1542,7 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "name": S.optional(S.String),
     "padding": S.optional(S.Union(S.Number, PaddingClass)),
     "projection": S.optional(Projection),
-    "selection": S.optional(S.Record({ key: S.String, value: SelectionDef})),
+    "selection": S.optional(mapSchema(SelectionDef)),
     "title": S.optional(S.Union(S.String, TitleParams)),
     "transform": S.optional(S.Array(Transform)),
     "width": S.optional(S.Number),
@@ -1550,7 +1568,7 @@ export class Spec extends S.Class<Spec>("Spec")({
     "encoding": S.optional(Encoding),
     "mark": S.optional(S.Union(Mark, MarkDef)),
     "projection": S.optional(Projection),
-    "selection": S.optional(S.Record({ key: S.String, value: SelectionDef})),
+    "selection": S.optional(mapSchema(SelectionDef)),
     "facet": S.optional(FacetMapping),
     "spec": S.optional(S.suspend(() => Spec)),
     "repeat": S.optional(Repeat),
@@ -1571,5 +1589,5 @@ export class LayerSpec extends S.Class<LayerSpec>("LayerSpec")({
     "encoding": S.optional(Encoding),
     "mark": S.optional(S.Union(Mark, MarkDef)),
     "projection": S.optional(Projection),
-    "selection": S.optional(S.Record({ key: S.String, value: SelectionDef})),
+    "selection": S.optional(mapSchema(SelectionDef)),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/00ec5.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/00ec5.json/default/TopLevel.ts
index c6fce40..3778fdf 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/00ec5.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/00ec5.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export const Type = S.Literal(
     "string",
@@ -56,7 +74,7 @@ export class Property extends S.Class<Property>("Property")({
 }) {}
 
 export class Provider extends S.Class<Provider>("Provider")({
-    "properties": S.Record({ key: S.String, value: Property}),
+    "properties": mapSchema(Property),
 }) {}
 
 export class Definitions extends S.Class<Definitions>("Definitions")({
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/033b1.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/033b1.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/033b1.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/033b1.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/09f54.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/09f54.json/default/TopLevel.ts
index 247697e..70f3102 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/09f54.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/09f54.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Description extends S.Class<Description>("Description")({
     "base_period": S.String,
@@ -14,6 +32,6 @@ export class Datum extends S.Class<Datum>("Datum")({
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "data": S.Record({ key: S.String, value: Datum}),
+    "data": mapSchema(Datum),
     "description": Description,
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/167d6.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/167d6.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/167d6.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/167d6.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/43eaf.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/43eaf.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/43eaf.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/43eaf.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/5f3a1.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/5f3a1.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/5f3a1.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/5f3a1.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/6260a.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/6260a.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/6260a.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/6260a.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/70c77.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/70c77.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/70c77.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/70c77.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/75912.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/75912.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/75912.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/75912.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/76ae1.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/76ae1.json/default/TopLevel.ts
index 5d1b840..9e3da0d 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/76ae1.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/76ae1.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export const FormatEnum = S.Literal(
     "string",
@@ -80,7 +98,7 @@ export class Property extends S.Class<Property>("Property")({
 }) {}
 
 export class Article extends S.Class<Article>("Article")({
-    "properties": S.Record({ key: S.String, value: Property}),
+    "properties": mapSchema(Property),
 }) {}
 
 export class Definitions extends S.Class<Definitions>("Definitions")({
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/7d397.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/7d397.json/default/TopLevel.ts
index ed07ac3..834d111 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/7d397.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/7d397.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export const Type = S.Literal(
     "string",
@@ -67,7 +85,7 @@ export class Property extends S.Class<Property>("Property")({
 }) {}
 
 export class List extends S.Class<List>("List")({
-    "properties": S.Record({ key: S.String, value: Property}),
+    "properties": mapSchema(Property),
 }) {}
 
 export class Definitions extends S.Class<Definitions>("Definitions")({
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/7f568.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/7f568.json/default/TopLevel.ts
index 70c0576..f9e2f20 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/7f568.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/7f568.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export const Language = S.Literal(
     "Markdown",
@@ -26,7 +44,7 @@ export class TopLevelElement extends S.Class<TopLevelElement>("TopLevelElement")
     "commits_url": S.String,
     "created_at": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/)),
     "description": S.NullOr(S.String),
-    "files": S.Record({ key: S.String, value: File}),
+    "files": mapSchema(File),
     "forks_url": S.String,
     "git_pull_url": S.String,
     "git_push_url": S.String,
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/9617f.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/9617f.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/9617f.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/9617f.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/a9691.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/a9691.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/a9691.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/a9691.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/ac944.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/ac944.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/ac944.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/ac944.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/c0356.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/c0356.json/default/TopLevel.ts
index ea7888c..e9c32ba 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/c0356.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/c0356.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Description extends S.Class<Description>("Description")({
     "base_period": S.String,
@@ -13,6 +31,6 @@ export class Datum extends S.Class<Datum>("Datum")({
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "data": S.Record({ key: S.String, value: Datum}),
+    "data": mapSchema(Datum),
     "description": Description,
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/cb81e.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/cb81e.json/default/TopLevel.ts
index eeb3174..40f6fa2 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/cb81e.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/cb81e.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Description extends S.Class<Description>("Description")({
     "base_period": S.String,
@@ -9,6 +27,6 @@ export class Description extends S.Class<Description>("Description")({
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "data": S.Record({ key: S.String, value: S.String}),
+    "data": mapSchema(S.String),
     "description": Description,
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/cd463.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/cd463.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/cd463.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/cd463.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/cfbce.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/cfbce.json/default/TopLevel.ts
index f216282..4387456 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/cfbce.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/cfbce.json/default/TopLevel.ts
@@ -1,8 +1,26 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "base": S.String,
     "date": S.String.pipe(S.pattern(/^\d{4}-\d{2}-\d{2}$/)),
-    "rates": S.Record({ key: S.String, value: S.Number}),
+    "rates": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/e324e.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/e324e.json/default/TopLevel.ts
index e290adb..d0d7497 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/e324e.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/e324e.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export const Type = S.Literal(
     "string",
@@ -61,7 +79,7 @@ export class Property extends S.Class<Property>("Property")({
 }) {}
 
 export class Rate extends S.Class<Rate>("Rate")({
-    "properties": S.Record({ key: S.String, value: Property}),
+    "properties": mapSchema(Property),
 }) {}
 
 export class Definitions extends S.Class<Definitions>("Definitions")({
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/ed095.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/ed095.json/default/TopLevel.ts
index a3dc3b3..13465fe 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/ed095.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/ed095.json/default/TopLevel.ts
@@ -1,4 +1,22 @@
 import * as S from "effect/Schema";
 
-export const TopLevel = S.Record({ key: S.String, value: S.String});
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
+export const TopLevel = mapSchema(S.String);
 export type TopLevel = S.Schema.Type<typeof TopLevel>;
diff --git a/base/typescript-effect-schema/test/inputs/json/misc/fd329.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/misc/fd329.json/default/TopLevel.ts
index 247697e..70f3102 100644
--- a/base/typescript-effect-schema/test/inputs/json/misc/fd329.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/misc/fd329.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Description extends S.Class<Description>("Description")({
     "base_period": S.String,
@@ -14,6 +32,6 @@ export class Datum extends S.Class<Datum>("Datum")({
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "data": S.Record({ key: S.String, value: Datum}),
+    "data": mapSchema(Datum),
     "description": Description,
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/bug2037.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/bug2037.json/default/TopLevel.ts
index a6159e9..f965285 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/bug2037.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/bug2037.json/default/TopLevel.ts
@@ -1,17 +1,35 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Reward extends S.Class<Reward>("Reward")(S.Struct({}).pipe(S.filter(value => typeof value === "object" && value !== null && !Array.isArray(value)))
 ) {}
 
 export class Objective extends S.Class<Objective>("Objective")({
-    "rewards": S.Record({ key: S.String, value: Reward}),
+    "rewards": mapSchema(Reward),
 }) {}
 
 export class MissionSpec extends S.Class<MissionSpec>("MissionSpec")({
-    "objectives": S.Record({ key: S.String, value: Objective}),
+    "objectives": mapSchema(Objective),
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "mission_specs": S.Record({ key: S.String, value: MissionSpec}),
+    "mission_specs": mapSchema(MissionSpec),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/bug855-short.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/bug855-short.json/default/TopLevel.ts
index edbfaa7..2368266 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/bug855-short.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/bug855-short.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevelValue extends S.Class<TopLevelValue>("TopLevelValue")({
     "channel_id": S.String.pipe(S.pattern(/^-?\d+$/)),
@@ -9,5 +27,5 @@ export class TopLevelValue extends S.Class<TopLevelValue>("TopLevelValue")({
     "id": S.Int,
 }) {}
 
-export const TopLevel = S.Record({ key: S.String, value: TopLevelValue});
+export const TopLevel = mapSchema(TopLevelValue);
 export type TopLevel = S.Schema.Type<typeof TopLevel>;
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/coin-pairs.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/coin-pairs.json/default/TopLevel.ts
index 6f306f6..3d30810 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/coin-pairs.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/coin-pairs.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Pair extends S.Class<Pair>("Pair")({
     "decimal_places": S.Int,
@@ -13,6 +31,6 @@ export class Pair extends S.Class<Pair>("Pair")({
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "pairs": S.Record({ key: S.String, value: Pair}),
+    "pairs": mapSchema(Pair),
     "server_time": S.Int,
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations1.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/default/TopLevel.ts
index e2e21a7..aa2b601 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations1.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Interacinar extends S.Class<Interacinar>("Interacinar")({
     "assapan": S.Number,
@@ -293,18 +311,18 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "citrated": S.Int,
     "clinodome": S.Array(S.Union(S.Number, S.String)),
     "coadjust": S.Array(S.Union(S.Number, CoadjustClass)),
-    "consilience": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}))),
-    "constructor": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
-    "continuative": S.Array(S.Union(S.Record({ key: S.String, value: S.Int}), S.String)),
+    "consilience": S.Array(S.Union(S.Number, mapSchema(S.Int))),
+    "constructor": S.Array(S.Union(S.Boolean, mapSchema(S.NullOr(S.Int)))),
+    "continuative": S.Array(S.Union(mapSchema(S.Int), S.String)),
     "credulity": S.Array(S.Union(S.Int, S.String, CredulityClass)),
-    "creviced": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "creviced": S.Array(S.Union(S.Boolean, mapSchema(S.Int), S.String)),
     "cubiculum": S.Array(S.Array(S.NullOr(S.Int))),
     "deruralize": S.Array(S.Union(S.Array(S.Null), S.Boolean, DeruralizeClass)),
     "diaereses": S.Array(S.Union(S.Array(S.Int), S.Boolean, DiaereseClass)),
     "dissolution": S.Array(S.NullOr(S.Array(S.Null))),
     "downstroke": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.String)),
     "electrotautomerism": S.Array(S.NullOr(S.Number)),
-    "eleutheromania": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "eleutheromania": S.Array(S.Union(S.Number, mapSchema(S.Int), S.String)),
     "encrust": Encrust,
     "entomoid": S.Array(S.Union(S.Int, CimeliaClass)),
     "epipaleolithic": S.Array(S.Union(S.Array(S.Int), S.Number)),
@@ -314,10 +332,10 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "flagmaking": S.Array(S.Union(S.Boolean, S.Number, FlagmakingClass)),
     "fluorometer": S.Array(S.Union(S.Int, S.String, S.Null)),
     "fulsome": S.Array(S.NullOr(S.Int)),
-    "fuzzy": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "fuzzy": S.Array(S.Union(S.Int, mapSchema(S.NullOr(S.Int)))),
     "gardenwards": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.String)),
-    "generalissimo": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}), S.Null)),
-    "habeas": S.Array(S.NullOr(S.Record({ key: S.String, value: S.Int}))),
+    "generalissimo": S.Array(S.Union(S.Boolean, mapSchema(S.Int), S.Null)),
+    "habeas": S.Array(S.NullOr(mapSchema(S.Int))),
     "hemicrystalline": S.Array(S.Union(S.String, CimeliaClass)),
     "hemocoele": S.Array(S.Union(S.Array(S.Int), HemocoeleClass)),
     "hoister": S.Array(S.Union(S.String, CimeliaClass, S.Null)),
@@ -328,5 +346,5 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "intentiveness": S.Array(S.Union(S.Number, S.String, CimeliaClass)),
     "interacinar": Interacinar,
     "intercorrelation": S.Array(S.NullOr(S.Array(S.Int))),
-    "jacutinga": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "jacutinga": S.Array(S.Union(S.Array(S.Int), mapSchema(S.NullOr(S.Int)))),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
index e2e21a7..aa2b601 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Interacinar extends S.Class<Interacinar>("Interacinar")({
     "assapan": S.Number,
@@ -293,18 +311,18 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "citrated": S.Int,
     "clinodome": S.Array(S.Union(S.Number, S.String)),
     "coadjust": S.Array(S.Union(S.Number, CoadjustClass)),
-    "consilience": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}))),
-    "constructor": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
-    "continuative": S.Array(S.Union(S.Record({ key: S.String, value: S.Int}), S.String)),
+    "consilience": S.Array(S.Union(S.Number, mapSchema(S.Int))),
+    "constructor": S.Array(S.Union(S.Boolean, mapSchema(S.NullOr(S.Int)))),
+    "continuative": S.Array(S.Union(mapSchema(S.Int), S.String)),
     "credulity": S.Array(S.Union(S.Int, S.String, CredulityClass)),
-    "creviced": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "creviced": S.Array(S.Union(S.Boolean, mapSchema(S.Int), S.String)),
     "cubiculum": S.Array(S.Array(S.NullOr(S.Int))),
     "deruralize": S.Array(S.Union(S.Array(S.Null), S.Boolean, DeruralizeClass)),
     "diaereses": S.Array(S.Union(S.Array(S.Int), S.Boolean, DiaereseClass)),
     "dissolution": S.Array(S.NullOr(S.Array(S.Null))),
     "downstroke": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.String)),
     "electrotautomerism": S.Array(S.NullOr(S.Number)),
-    "eleutheromania": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "eleutheromania": S.Array(S.Union(S.Number, mapSchema(S.Int), S.String)),
     "encrust": Encrust,
     "entomoid": S.Array(S.Union(S.Int, CimeliaClass)),
     "epipaleolithic": S.Array(S.Union(S.Array(S.Int), S.Number)),
@@ -314,10 +332,10 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "flagmaking": S.Array(S.Union(S.Boolean, S.Number, FlagmakingClass)),
     "fluorometer": S.Array(S.Union(S.Int, S.String, S.Null)),
     "fulsome": S.Array(S.NullOr(S.Int)),
-    "fuzzy": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "fuzzy": S.Array(S.Union(S.Int, mapSchema(S.NullOr(S.Int)))),
     "gardenwards": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.String)),
-    "generalissimo": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}), S.Null)),
-    "habeas": S.Array(S.NullOr(S.Record({ key: S.String, value: S.Int}))),
+    "generalissimo": S.Array(S.Union(S.Boolean, mapSchema(S.Int), S.Null)),
+    "habeas": S.Array(S.NullOr(mapSchema(S.Int))),
     "hemicrystalline": S.Array(S.Union(S.String, CimeliaClass)),
     "hemocoele": S.Array(S.Union(S.Array(S.Int), HemocoeleClass)),
     "hoister": S.Array(S.Union(S.String, CimeliaClass, S.Null)),
@@ -328,5 +346,5 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "intentiveness": S.Array(S.Union(S.Number, S.String, CimeliaClass)),
     "interacinar": Interacinar,
     "intercorrelation": S.Array(S.NullOr(S.Array(S.Int))),
-    "jacutinga": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "jacutinga": S.Array(S.Union(S.Array(S.Int), mapSchema(S.NullOr(S.Int)))),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations2.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/default/TopLevel.ts
index 79d276d..35819f7 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations2.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class OskarClass extends S.Class<OskarClass>("OskarClass")({
     "Acrobates": S.Null,
@@ -233,8 +251,8 @@ export class AlleviateClass extends S.Class<AlleviateClass>("AlleviateClass")({
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "Abranchiata": S.Array(S.Union(S.Array(S.Int), S.Int, S.Null)),
-    "academe": S.Array(S.Union(S.Array(S.Int), S.Int, S.Record({ key: S.String, value: S.Int}))),
-    "acquirable": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.Record({ key: S.String, value: S.Int}))),
+    "academe": S.Array(S.Union(S.Array(S.Int), S.Int, mapSchema(S.Int))),
+    "acquirable": S.Array(S.Union(S.Array(S.NullOr(S.Int)), mapSchema(S.Int))),
     "aerometry": S.Array(S.Union(S.Boolean, S.Number)),
     "alexin": S.Array(S.Union(S.Array(S.Int), S.Boolean)),
     "alleviate": S.Array(S.Union(S.Array(S.NullOr(S.Int)), AlleviateClass)),
@@ -243,38 +261,38 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "amphithyron": S.Array(S.NullOr(Amphithyron)),
     "Andriana": S.Array(S.NullOr(S.String)),
     "ankee": S.Array(S.Union(S.Array(S.Int), S.Int, AnkeeClass)),
-    "annihilator": S.Array(S.NullOr(S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "annihilator": S.Array(S.NullOr(mapSchema(S.NullOr(S.Int)))),
     "annulose": S.Null,
     "Ansarie": S.Array(S.Union(S.Array(S.Int), AnsarieClass, S.Null)),
     "aphasia": S.Array(S.Union(S.Array(S.Int), S.Int)),
     "asprawl": S.Array(S.Union(S.Number, S.String)),
     "attractive": S.Array(S.NullOr(S.Boolean)),
-    "barksome": S.Record({ key: S.String, value: S.Int}),
+    "barksome": mapSchema(S.Int),
     "bedesman": S.Array(S.Union(S.Boolean, S.Number, S.String)),
     "belard": S.Array(S.Union(S.Array(S.Int), S.Number, Rebecca)),
-    "bocking": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Record({ key: S.String, value: S.Int}))),
-    "brawlingly": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "bocking": S.Array(S.Union(S.Array(S.Int), S.Boolean, mapSchema(S.Int))),
+    "brawlingly": S.Array(S.Union(S.Array(S.Null), mapSchema(S.NullOr(S.Int)))),
     "brookie": S.Array(S.Union(S.Array(S.Int), Rebecca)),
     "bumboatman": S.Array(S.Union(S.Array(S.Null), S.String, S.Null)),
     "bystreet": S.Array(S.Null),
     "calaverite": S.Array(S.Union(S.Array(S.Int), S.String)),
-    "catallactic": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Record({ key: S.String, value: S.Int}))),
-    "cemental": S.Array(S.Union(S.Array(S.Int), S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "catallactic": S.Array(S.Union(S.Array(S.Null), S.Boolean, mapSchema(S.Int))),
+    "cemental": S.Array(S.Union(S.Array(S.Int), S.Number, mapSchema(S.Int))),
     "Chytridiaceae": S.Array(S.Union(S.Boolean, ChytridiaceaeClass, S.Null)),
     "Discordia": S.Array(S.Union(S.Array(S.Int), DiscordiaClass)),
     "Endomyces": S.Array(S.Union(S.Int, S.String)),
     "Epinephelidae": S.Array(S.Union(S.Boolean, S.Int, S.String)),
-    "Eupatorium": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}))),
+    "Eupatorium": S.Array(S.Union(S.Array(S.Null), mapSchema(S.Int))),
     "Gryphosaurus": S.Array(S.Union(S.Array(S.Int), S.String, GryphosaurusClass)),
-    "Koryak": S.Array(S.Union(S.Record({ key: S.String, value: S.NullOr(S.Int)}), S.String)),
+    "Koryak": S.Array(S.Union(mapSchema(S.NullOr(S.Int)), S.String)),
     "Lavinia": S.Array(S.Union(S.String, LaviniaClass)),
     "Oskar": S.Array(S.Union(S.Array(S.Int), OskarClass)),
     "Rebecca": S.Array(S.Union(S.Int, S.String, Rebecca)),
     "Rhomboganoidei": S.Array(S.Union(S.Array(S.Int), S.String, Rebecca)),
     "Rigsmal": S.Boolean,
     "Ruellia": S.Array(S.Union(S.Boolean, S.String, Rebecca)),
-    "School": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "School": S.Array(S.Union(S.Int, mapSchema(S.Int), S.Null)),
     "Shakespearolater": S.Array(S.Union(S.Array(S.Int), S.Number, S.String)),
     "Svan": S.Array(S.Number),
-    "Wayao": S.Record({ key: S.String, value: S.Number}),
+    "Wayao": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
index 79d276d..35819f7 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class OskarClass extends S.Class<OskarClass>("OskarClass")({
     "Acrobates": S.Null,
@@ -233,8 +251,8 @@ export class AlleviateClass extends S.Class<AlleviateClass>("AlleviateClass")({
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "Abranchiata": S.Array(S.Union(S.Array(S.Int), S.Int, S.Null)),
-    "academe": S.Array(S.Union(S.Array(S.Int), S.Int, S.Record({ key: S.String, value: S.Int}))),
-    "acquirable": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.Record({ key: S.String, value: S.Int}))),
+    "academe": S.Array(S.Union(S.Array(S.Int), S.Int, mapSchema(S.Int))),
+    "acquirable": S.Array(S.Union(S.Array(S.NullOr(S.Int)), mapSchema(S.Int))),
     "aerometry": S.Array(S.Union(S.Boolean, S.Number)),
     "alexin": S.Array(S.Union(S.Array(S.Int), S.Boolean)),
     "alleviate": S.Array(S.Union(S.Array(S.NullOr(S.Int)), AlleviateClass)),
@@ -243,38 +261,38 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "amphithyron": S.Array(S.NullOr(Amphithyron)),
     "Andriana": S.Array(S.NullOr(S.String)),
     "ankee": S.Array(S.Union(S.Array(S.Int), S.Int, AnkeeClass)),
-    "annihilator": S.Array(S.NullOr(S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "annihilator": S.Array(S.NullOr(mapSchema(S.NullOr(S.Int)))),
     "annulose": S.Null,
     "Ansarie": S.Array(S.Union(S.Array(S.Int), AnsarieClass, S.Null)),
     "aphasia": S.Array(S.Union(S.Array(S.Int), S.Int)),
     "asprawl": S.Array(S.Union(S.Number, S.String)),
     "attractive": S.Array(S.NullOr(S.Boolean)),
-    "barksome": S.Record({ key: S.String, value: S.Int}),
+    "barksome": mapSchema(S.Int),
     "bedesman": S.Array(S.Union(S.Boolean, S.Number, S.String)),
     "belard": S.Array(S.Union(S.Array(S.Int), S.Number, Rebecca)),
-    "bocking": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Record({ key: S.String, value: S.Int}))),
-    "brawlingly": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "bocking": S.Array(S.Union(S.Array(S.Int), S.Boolean, mapSchema(S.Int))),
+    "brawlingly": S.Array(S.Union(S.Array(S.Null), mapSchema(S.NullOr(S.Int)))),
     "brookie": S.Array(S.Union(S.Array(S.Int), Rebecca)),
     "bumboatman": S.Array(S.Union(S.Array(S.Null), S.String, S.Null)),
     "bystreet": S.Array(S.Null),
     "calaverite": S.Array(S.Union(S.Array(S.Int), S.String)),
-    "catallactic": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Record({ key: S.String, value: S.Int}))),
-    "cemental": S.Array(S.Union(S.Array(S.Int), S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "catallactic": S.Array(S.Union(S.Array(S.Null), S.Boolean, mapSchema(S.Int))),
+    "cemental": S.Array(S.Union(S.Array(S.Int), S.Number, mapSchema(S.Int))),
     "Chytridiaceae": S.Array(S.Union(S.Boolean, ChytridiaceaeClass, S.Null)),
     "Discordia": S.Array(S.Union(S.Array(S.Int), DiscordiaClass)),
     "Endomyces": S.Array(S.Union(S.Int, S.String)),
     "Epinephelidae": S.Array(S.Union(S.Boolean, S.Int, S.String)),
-    "Eupatorium": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}))),
+    "Eupatorium": S.Array(S.Union(S.Array(S.Null), mapSchema(S.Int))),
     "Gryphosaurus": S.Array(S.Union(S.Array(S.Int), S.String, GryphosaurusClass)),
-    "Koryak": S.Array(S.Union(S.Record({ key: S.String, value: S.NullOr(S.Int)}), S.String)),
+    "Koryak": S.Array(S.Union(mapSchema(S.NullOr(S.Int)), S.String)),
     "Lavinia": S.Array(S.Union(S.String, LaviniaClass)),
     "Oskar": S.Array(S.Union(S.Array(S.Int), OskarClass)),
     "Rebecca": S.Array(S.Union(S.Int, S.String, Rebecca)),
     "Rhomboganoidei": S.Array(S.Union(S.Array(S.Int), S.String, Rebecca)),
     "Rigsmal": S.Boolean,
     "Ruellia": S.Array(S.Union(S.Boolean, S.String, Rebecca)),
-    "School": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "School": S.Array(S.Union(S.Int, mapSchema(S.Int), S.Null)),
     "Shakespearolater": S.Array(S.Union(S.Array(S.Int), S.Number, S.String)),
     "Svan": S.Array(S.Number),
-    "Wayao": S.Record({ key: S.String, value: S.Number}),
+    "Wayao": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations3.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/default/TopLevel.ts
index 48cb91d..856d6e0 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations3.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class PrefreshmanClass extends S.Class<PrefreshmanClass>("PrefreshmanClass")({
     "azorubine": S.Null,
@@ -340,7 +358,7 @@ export class JurorClass extends S.Class<JurorClass>("JurorClass")({
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "juror": S.Array(S.Union(S.Boolean, JurorClass)),
-    "kongoni": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}))),
+    "kongoni": S.Array(S.Union(S.Array(S.Int), mapSchema(S.Int))),
     "ladronism": S.Array(S.Union(S.Number, S.String, LadronismClass)),
     "landlubberly": S.Array(S.Union(S.Boolean, S.Int, LandlubberlyClass)),
     "listener": S.Array(S.Union(S.Array(S.Null), S.Int)),
@@ -361,24 +379,24 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "nonvaluation": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Number)),
     "occupationalist": S.Array(S.Union(S.Array(S.Null), OccupationalistClass, S.Null)),
     "outrival": S.Array(S.Union(S.Number, OutrivalClass, S.Null)),
-    "paleographically": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
-    "pamphletwise": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "paleographically": S.Array(S.Union(S.Number, mapSchema(S.NullOr(S.Int)))),
+    "pamphletwise": S.Array(S.Union(S.Int, mapSchema(S.Int), S.String)),
     "pediatrics": S.Array(S.Union(S.Boolean, S.Number, S.Null)),
     "perceptive": S.Array(S.Boolean),
     "piaculum": S.Array(S.Union(S.Number, PiaculumClass)),
     "piccadilly": S.Array(S.Union(S.Number, S.String, S.Null)),
     "piffler": S.Array(S.Union(S.Array(S.Null), MonaziteClass)),
     "pithful": S.Array(S.Union(S.Boolean, S.Int, S.Null)),
-    "placuntitis": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}))),
-    "plectopterous": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "placuntitis": S.Array(S.Union(S.Int, mapSchema(S.Int))),
+    "plectopterous": S.Array(S.Union(S.Number, mapSchema(S.Int))),
     "pneumocele": S.Array(S.NullOr(Pneumocele)),
     "poliorcetic": S.Array(S.Union(S.Boolean, MonaziteClass)),
-    "poormaster": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "poormaster": S.Array(S.Union(S.Array(S.Int), mapSchema(S.Int), S.Null)),
     "potwhisky": S.Array(S.Union(S.Int, PotwhiskyClass, S.Null)),
     "practicalizer": S.Array(S.Union(S.Array(S.Null), S.String, MonaziteClass)),
     "prefreshman": S.Array(S.Union(S.Array(S.Null), S.String, PrefreshmanClass)),
     "prehensility": S.Array(S.Union(S.Array(S.Null), S.Boolean, MonaziteClass)),
     "prevoidance": S.Array(S.Union(S.Array(S.Int), S.Int, MonaziteClass)),
-    "probant": S.Array(S.Record({ key: S.String, value: S.NullOr(S.Int)})),
+    "probant": S.Array(mapSchema(S.NullOr(S.Int))),
     "protext": S.Array(S.Union(S.Array(S.Int), S.Boolean, MonaziteClass)),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
index 48cb91d..856d6e0 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class PrefreshmanClass extends S.Class<PrefreshmanClass>("PrefreshmanClass")({
     "azorubine": S.Null,
@@ -340,7 +358,7 @@ export class JurorClass extends S.Class<JurorClass>("JurorClass")({
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "juror": S.Array(S.Union(S.Boolean, JurorClass)),
-    "kongoni": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}))),
+    "kongoni": S.Array(S.Union(S.Array(S.Int), mapSchema(S.Int))),
     "ladronism": S.Array(S.Union(S.Number, S.String, LadronismClass)),
     "landlubberly": S.Array(S.Union(S.Boolean, S.Int, LandlubberlyClass)),
     "listener": S.Array(S.Union(S.Array(S.Null), S.Int)),
@@ -361,24 +379,24 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "nonvaluation": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Number)),
     "occupationalist": S.Array(S.Union(S.Array(S.Null), OccupationalistClass, S.Null)),
     "outrival": S.Array(S.Union(S.Number, OutrivalClass, S.Null)),
-    "paleographically": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
-    "pamphletwise": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "paleographically": S.Array(S.Union(S.Number, mapSchema(S.NullOr(S.Int)))),
+    "pamphletwise": S.Array(S.Union(S.Int, mapSchema(S.Int), S.String)),
     "pediatrics": S.Array(S.Union(S.Boolean, S.Number, S.Null)),
     "perceptive": S.Array(S.Boolean),
     "piaculum": S.Array(S.Union(S.Number, PiaculumClass)),
     "piccadilly": S.Array(S.Union(S.Number, S.String, S.Null)),
     "piffler": S.Array(S.Union(S.Array(S.Null), MonaziteClass)),
     "pithful": S.Array(S.Union(S.Boolean, S.Int, S.Null)),
-    "placuntitis": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}))),
-    "plectopterous": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "placuntitis": S.Array(S.Union(S.Int, mapSchema(S.Int))),
+    "plectopterous": S.Array(S.Union(S.Number, mapSchema(S.Int))),
     "pneumocele": S.Array(S.NullOr(Pneumocele)),
     "poliorcetic": S.Array(S.Union(S.Boolean, MonaziteClass)),
-    "poormaster": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "poormaster": S.Array(S.Union(S.Array(S.Int), mapSchema(S.Int), S.Null)),
     "potwhisky": S.Array(S.Union(S.Int, PotwhiskyClass, S.Null)),
     "practicalizer": S.Array(S.Union(S.Array(S.Null), S.String, MonaziteClass)),
     "prefreshman": S.Array(S.Union(S.Array(S.Null), S.String, PrefreshmanClass)),
     "prehensility": S.Array(S.Union(S.Array(S.Null), S.Boolean, MonaziteClass)),
     "prevoidance": S.Array(S.Union(S.Array(S.Int), S.Int, MonaziteClass)),
-    "probant": S.Array(S.Record({ key: S.String, value: S.NullOr(S.Int)})),
+    "probant": S.Array(mapSchema(S.NullOr(S.Int))),
     "protext": S.Array(S.Union(S.Array(S.Int), S.Boolean, MonaziteClass)),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations4.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/default/TopLevel.ts
index d7555c4..eed8ffe 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations4.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class WrothyClass extends S.Class<WrothyClass>("WrothyClass")({
     "Aeschynanthus": S.Null,
@@ -389,7 +407,7 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "pulpitism": S.Array(S.Union(S.Array(S.Int), S.Number, PulpitismClass)),
     "pyodermia": S.Array(S.Union(S.Int, PyodermiaClass)),
     "quebrachine": S.Array(S.Union(S.Boolean, QuebrachineClass, S.Null)),
-    "querier": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}))),
+    "querier": S.Array(S.Union(S.Boolean, mapSchema(S.Int))),
     "rebarbative": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Number)),
     "reimagine": S.Array(Reimagine),
     "ressaut": Ressaut,
@@ -398,10 +416,10 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "rewrite": S.Array(S.Union(S.Array(S.Null), S.Number, RewriteClass)),
     "saccoderm": S.Array(S.Union(S.Array(S.Int), S.String, S.Null)),
     "santir": S.Array(S.Union(S.Number, SantirClass)),
-    "saprophilous": S.Array(S.Union(S.Record({ key: S.String, value: S.Int}), S.String, S.Null)),
+    "saprophilous": S.Array(S.Union(mapSchema(S.Int), S.String, S.Null)),
     "saxten": S.Array(S.Union(S.String, SaxtenClass)),
     "scatty": S.Array(S.NullOr(Scatty)),
-    "scoffer": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "scoffer": S.Array(S.Union(S.Array(S.Null), mapSchema(S.Int), S.Null)),
     "scrampum": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Null)),
     "semantic": S.Number,
     "serpentinic": S.Array(S.Union(S.Array(S.Int), S.Number)),
@@ -409,7 +427,7 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "sistering": S.Array(S.Union(S.Array(S.Null), S.Int, SisteringClass)),
     "staghunting": S.Array(Staghunting),
     "stagmometer": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.String)),
-    "stimulability": S.Array(S.Union(S.Boolean, S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "stimulability": S.Array(S.Union(S.Boolean, S.Int, mapSchema(S.Int))),
     "strangleable": S.Array(S.Union(S.Array(S.Null), S.Number)),
     "strenuosity": S.Array(S.Union(S.Array(S.Null), StrenuosityClass)),
     "tabaxir": S.Array(S.Union(S.Boolean, S.Number)),
@@ -419,22 +437,22 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "tortricine": S.Array(S.Union(S.Array(S.NullOr(S.Int)), QuebrachineClass)),
     "truantcy": S.Array(S.Union(S.Boolean, TruantcyClass)),
     "turgesce": S.Array(S.String),
-    "unbeginning": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}), S.String)),
+    "unbeginning": S.Array(S.Union(S.Array(S.Null), mapSchema(S.Int), S.String)),
     "underdunged": S.Array(S.Number),
-    "undesirability": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}), S.String)),
-    "unerasing": S.Array(S.Union(S.Array(S.Null), S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "undesirability": S.Array(S.Union(S.Array(S.Int), mapSchema(S.Int), S.String)),
+    "unerasing": S.Array(S.Union(S.Array(S.Null), S.Int, mapSchema(S.Int))),
     "unguentarium": S.Array(S.Union(S.Array(S.Null), S.Int, S.Null)),
     "unimpeachably": S.Array(S.Union(S.Boolean, UnimpeachablyClass)),
-    "unmortgaged": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "unmortgaged": S.Array(S.Union(S.Number, mapSchema(S.Int), S.Null)),
     "unobstructed": S.Array(S.Union(S.Int, QuebrachineClass, S.Null)),
     "unreceptivity": S.Array(S.Union(S.Array(S.Null), S.Int, S.String)),
     "unsatisfactoriness": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Int)),
     "unsecurity": S.Array(S.Int),
     "unstressed": S.Array(S.Union(S.Boolean, S.String, UnstressedClass)),
-    "untasked": S.Array(S.Union(S.Array(S.Null), S.Number, S.Record({ key: S.String, value: S.Int}))),
-    "unvarying": S.Array(S.Union(S.Boolean, S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "untasked": S.Array(S.Union(S.Array(S.Null), S.Number, mapSchema(S.Int))),
+    "unvarying": S.Array(S.Union(S.Boolean, S.Number, mapSchema(S.Int))),
     "vehemently": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Null)),
-    "warriorship": S.Record({ key: S.String, value: S.Boolean}),
+    "warriorship": mapSchema(S.Boolean),
     "whitepot": S.Array(S.Union(S.Number, QuebrachineClass)),
     "wrothy": S.Array(S.Union(S.Array(S.Null), WrothyClass)),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
index d7555c4..eed8ffe 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class WrothyClass extends S.Class<WrothyClass>("WrothyClass")({
     "Aeschynanthus": S.Null,
@@ -389,7 +407,7 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "pulpitism": S.Array(S.Union(S.Array(S.Int), S.Number, PulpitismClass)),
     "pyodermia": S.Array(S.Union(S.Int, PyodermiaClass)),
     "quebrachine": S.Array(S.Union(S.Boolean, QuebrachineClass, S.Null)),
-    "querier": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}))),
+    "querier": S.Array(S.Union(S.Boolean, mapSchema(S.Int))),
     "rebarbative": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Number)),
     "reimagine": S.Array(Reimagine),
     "ressaut": Ressaut,
@@ -398,10 +416,10 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "rewrite": S.Array(S.Union(S.Array(S.Null), S.Number, RewriteClass)),
     "saccoderm": S.Array(S.Union(S.Array(S.Int), S.String, S.Null)),
     "santir": S.Array(S.Union(S.Number, SantirClass)),
-    "saprophilous": S.Array(S.Union(S.Record({ key: S.String, value: S.Int}), S.String, S.Null)),
+    "saprophilous": S.Array(S.Union(mapSchema(S.Int), S.String, S.Null)),
     "saxten": S.Array(S.Union(S.String, SaxtenClass)),
     "scatty": S.Array(S.NullOr(Scatty)),
-    "scoffer": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "scoffer": S.Array(S.Union(S.Array(S.Null), mapSchema(S.Int), S.Null)),
     "scrampum": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Null)),
     "semantic": S.Number,
     "serpentinic": S.Array(S.Union(S.Array(S.Int), S.Number)),
@@ -409,7 +427,7 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "sistering": S.Array(S.Union(S.Array(S.Null), S.Int, SisteringClass)),
     "staghunting": S.Array(Staghunting),
     "stagmometer": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.String)),
-    "stimulability": S.Array(S.Union(S.Boolean, S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "stimulability": S.Array(S.Union(S.Boolean, S.Int, mapSchema(S.Int))),
     "strangleable": S.Array(S.Union(S.Array(S.Null), S.Number)),
     "strenuosity": S.Array(S.Union(S.Array(S.Null), StrenuosityClass)),
     "tabaxir": S.Array(S.Union(S.Boolean, S.Number)),
@@ -419,22 +437,22 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "tortricine": S.Array(S.Union(S.Array(S.NullOr(S.Int)), QuebrachineClass)),
     "truantcy": S.Array(S.Union(S.Boolean, TruantcyClass)),
     "turgesce": S.Array(S.String),
-    "unbeginning": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}), S.String)),
+    "unbeginning": S.Array(S.Union(S.Array(S.Null), mapSchema(S.Int), S.String)),
     "underdunged": S.Array(S.Number),
-    "undesirability": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}), S.String)),
-    "unerasing": S.Array(S.Union(S.Array(S.Null), S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "undesirability": S.Array(S.Union(S.Array(S.Int), mapSchema(S.Int), S.String)),
+    "unerasing": S.Array(S.Union(S.Array(S.Null), S.Int, mapSchema(S.Int))),
     "unguentarium": S.Array(S.Union(S.Array(S.Null), S.Int, S.Null)),
     "unimpeachably": S.Array(S.Union(S.Boolean, UnimpeachablyClass)),
-    "unmortgaged": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "unmortgaged": S.Array(S.Union(S.Number, mapSchema(S.Int), S.Null)),
     "unobstructed": S.Array(S.Union(S.Int, QuebrachineClass, S.Null)),
     "unreceptivity": S.Array(S.Union(S.Array(S.Null), S.Int, S.String)),
     "unsatisfactoriness": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Int)),
     "unsecurity": S.Array(S.Int),
     "unstressed": S.Array(S.Union(S.Boolean, S.String, UnstressedClass)),
-    "untasked": S.Array(S.Union(S.Array(S.Null), S.Number, S.Record({ key: S.String, value: S.Int}))),
-    "unvarying": S.Array(S.Union(S.Boolean, S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "untasked": S.Array(S.Union(S.Array(S.Null), S.Number, mapSchema(S.Int))),
+    "unvarying": S.Array(S.Union(S.Boolean, S.Number, mapSchema(S.Int))),
     "vehemently": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Null)),
-    "warriorship": S.Record({ key: S.String, value: S.Boolean}),
+    "warriorship": mapSchema(S.Boolean),
     "whitepot": S.Array(S.Union(S.Number, QuebrachineClass)),
     "wrothy": S.Array(S.Union(S.Array(S.Null), WrothyClass)),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/nbl-stats.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/nbl-stats.json/default/TopLevel.ts
index a1bb03c..1e8dd43 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/nbl-stats.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/nbl-stats.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export const LeaddatumEnum = S.Literal(
     "",
@@ -222,11 +240,11 @@ export class Pbp extends S.Class<Pbp>("Pbp")({
 }) {}
 
 export class Totallds extends S.Class<Totallds>("Totallds")({
-    "sAssists": S.Record({ key: S.String, value: Scorer}),
-    "sBlocks": S.Record({ key: S.String, value: Scorer}),
-    "sPoints": S.Record({ key: S.String, value: Scorer}),
-    "sReboundsTotal": S.Record({ key: S.String, value: Scorer}),
-    "sSteals": S.Record({ key: S.String, value: Scorer}),
+    "sAssists": mapSchema(Scorer),
+    "sBlocks": mapSchema(Scorer),
+    "sPoints": mapSchema(Scorer),
+    "sReboundsTotal": mapSchema(Scorer),
+    "sSteals": mapSchema(Scorer),
 }) {}
 
 export class Team extends S.Class<Team>("Team")({
@@ -266,9 +284,9 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "periodLengthREGULAR": S.Int,
     "periodType": PerType,
     "periodsMax": S.Int,
-    "scorers": S.Record({ key: S.String, value: S.Array(Scorer)}),
+    "scorers": mapSchema(S.Array(Scorer)),
     "timeline": S.Array(S.Any),
-    "tm": S.Record({ key: S.String, value: S.suspend(() => Tm)}),
+    "tm": mapSchema(S.suspend(() => Tm)),
     "totalTimeAdded": S.Int,
     "totallds": Totallds,
 }) {}
@@ -278,11 +296,11 @@ export class SBlocks extends S.Class<SBlocks>("SBlocks")({
 }) {}
 
 export class Lds extends S.Class<Lds>("Lds")({
-    "sAssists": S.Record({ key: S.String, value: Scorer}),
+    "sAssists": mapSchema(Scorer),
     "sBlocks": SBlocks,
-    "sPoints": S.Record({ key: S.String, value: Scorer}),
-    "sReboundsTotal": S.Record({ key: S.String, value: Scorer}),
-    "sSteals": S.Record({ key: S.String, value: Scorer}),
+    "sPoints": mapSchema(Scorer),
+    "sReboundsTotal": mapSchema(Scorer),
+    "sSteals": mapSchema(Scorer),
 }) {}
 
 export class Tm extends S.Class<Tm>("Tm")({
@@ -298,7 +316,7 @@ export class Tm extends S.Class<Tm>("Tm")({
     "p2_score": S.Int,
     "p3_score": S.Int,
     "p4_score": S.Int,
-    "pl": S.Record({ key: S.String, value: Pl}),
+    "pl": mapSchema(Pl),
     "score": S.Int,
     "scoring": S.Array(Scorer),
     "shortName": S.String,
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/nested-objects.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/nested-objects.json/default/TopLevel.ts
index bc406fd..8de9de6 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/nested-objects.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/nested-objects.json/default/TopLevel.ts
@@ -1,7 +1,25 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "a": S.Record({ key: S.String, value: S.Int}),
-    "b": S.Record({ key: S.String, value: S.Int}),
+    "a": mapSchema(S.Int),
+    "b": mapSchema(S.Int),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/number-map.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/number-map.json/default/TopLevel.ts
index d0ee431..be65416 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/number-map.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/number-map.json/default/TopLevel.ts
@@ -1,6 +1,24 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "foo": S.Record({ key: S.String, value: S.Number}),
+    "foo": mapSchema(S.Number),
 }) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.ts
index 6f9779a..f4722a1 100644
--- a/base/typescript-effect-schema/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class PurplePerson extends S.Class<PurplePerson>("PurplePerson")({
     "intOrString": S.Int,
@@ -22,10 +40,10 @@ export class TopLevel extends S.Class<TopLevel>("TopLevel")({
     "differentThings": S.Array(S.Union(S.Int, S.NumberFromString.pipe(S.int()), DifferentThingClass)),
     "doubleValue": S.Number,
     "intValue": S.Int,
-    "mapValue": S.Record({ key: S.String, value: S.NullOr(S.Int)}),
+    "mapValue": mapSchema(S.NullOr(S.Int)),
     "name with spaces": S.Null,
     "nullValue": S.Null,
-    "nullableMapValue": S.Record({ key: S.String, value: S.NullOr(S.Int)}),
+    "nullableMapValue": mapSchema(S.NullOr(S.Int)),
     "people": S.Array(PersonElement),
     "person": PurplePerson,
     "stringValue": S.String,
diff --git a/base/typescript-effect-schema/test/inputs/json/samples/us-avg-temperatures.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/samples/us-avg-temperatures.json/default/TopLevel.ts
index 247697e..70f3102 100644
--- a/base/typescript-effect-schema/test/inputs/json/samples/us-avg-temperatures.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/samples/us-avg-temperatures.json/default/TopLevel.ts
@@ -1,5 +1,23 @@
 import * as S from "effect/Schema";
 
+const objectSchema = <A>() =>
+    S.declare(
+        (input): input is Record<string, A> =>
+            typeof input === "object" && input !== null && !Array.isArray(input)
+    );
+const mapSchema = <A, I, R>(value: S.Schema<A, I, R>) => {
+    const entries = S.transform(objectSchema<unknown>(), S.Array(S.Tuple(S.String, value)), {
+        strict: false,
+        decode: Object.entries,
+        encode: Object.fromEntries
+    });
+    return S.transform(entries, objectSchema<A>(), {
+        strict: false,
+        decode: Object.fromEntries,
+        encode: Object.entries
+    });
+};
+
 
 export class Description extends S.Class<Description>("Description")({
     "base_period": S.String,
@@ -14,6 +32,6 @@ export class Datum extends S.Class<Datum>("Datum")({
 }) {}
 
 export class TopLevel extends S.Class<TopLevel>("TopLevel")({
-    "data": S.Record({ key: S.String, value: Datum}),
+    "data": mapSchema(Datum),
     "description": Description,
 }) {}
