can1357/oh-my-pi · error · OmpTypeError

merge requires an object schema

Error message

merge requires an object schema

What it means

Object-merging combinators (`merge` and related n-ary object operations) can only operate on schemas whose underlying IR is an object type. If any operand resolves to a non-object type (string, array, union, primitive), the operation is undefined and omptype throws.

Source

Thrown at packages/omptype/src/type.ts:3245

	}
	const ir: IR = members.length === 0 ? { k: "never" } : members.length === 1 ? members[0] : { k: "union", members };
	return makeType(ir, [], {});
}

function buildAnd(definitions: readonly unknown[], resolve?: AliasResolver): InternalType;
function buildAnd<output, input>(definitions: readonly unknown[], resolve?: AliasResolver): FluentType<output, input>;
function buildAnd(definitions: readonly unknown[], resolve?: AliasResolver): InternalType {
	if (definitions.length === 0) return makeType({ k: "unknown" }, [], {});
	let ir = parseDef(definitions[0], resolve);
	for (let index = 1; index < definitions.length; index++) {
		ir = intersect(ir, parseDef(definitions[index], resolve));
	}
	return makeType(ir, [], {});
}

function requireNaryObject(ir: IR): ObjectIR {
	const resolved = resolveAlias(ir);
	if (resolved.k !== "object") throw new OmpTypeError("merge requires an object schema");
	return resolved;
}

function buildMerge(definitions: readonly unknown[], resolve?: AliasResolver): InternalType;
function buildMerge<output, input>(definitions: readonly unknown[], resolve?: AliasResolver): FluentType<output, input>;
function buildMerge(definitions: readonly unknown[], resolve?: AliasResolver): InternalType {
	if (definitions.length === 0) return makeType({ k: "anyobject" }, [], {});
	let object = requireNaryObject(parseDef(definitions[0], resolve));
	for (let index = 1; index < definitions.length; index++) {
		object = mergeObjects(object, requireNaryObject(parseDef(definitions[index], resolve)));
	}
	return makeType(object, [], {});
}

function buildPipe(definitions: readonly unknown[], resolve?: AliasResolver): InternalType;
function buildPipe<output, input>(definitions: readonly unknown[], resolve?: AliasResolver): FluentType<output, input>;
function buildPipe(definitions: readonly unknown[], resolve?: AliasResolver): InternalType {
	if (definitions.length === 0) return makeType({ k: "unknown" }, [], {});

View on GitHub (pinned to 9690622007)

Solutions

  1. Ensure every argument to merge is an object-typed schema (`type({...})` with object literal definition or `type` object blocks).
  2. If an operand is a union of objects, merge the individual object members or pick one branch.
  3. Check aliases referenced in the merge resolve to object definitions.

Example fix

// before
type.merge({ a: "string" }, "string[]")
// after
type.merge({ a: "string" }, { b: "string[]" })
Defensive patterns

Strategy: validation

Validate before calling

const isObjectSchema = (t: unknown) => { try { return (t as { expression?: string }).expression !== undefined && typeof (t as { json?(): unknown }).json === 'function'; } catch { return false; } };

Type guard

const isMergeable = (t: unknown): boolean => { try { const r = (t as InternalType); return r.expression.startsWith('{'); } catch { return false; } };

Try / catch

try { const merged = type.merge(a, b); } catch (e) { if (e instanceof OmpTypeError && e.message.includes('merge requires an object schema')) logNonObjectOperand(); else throw e; }

Prevention

When it happens

Trigger: Passing a non-object schema to `type.merge(...)` or a composed merge, e.g. `type.merge({ a: "string" }, "string[]")`, or merging an alias that resolves to a primitive/union.

Common situations: Merging schema constants where one was changed to a union or array during refactoring; passing a morph/mapped type whose resolved kind is not object; dynamically assembling schemas from config where one entry is a primitive validator.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/a93228e2224d2e51. Report an issue: GitHub.