API reference@evolu/commonType › discriminatedUnion

Call Signature

function discriminatedUnion<Members>(
  ...members: Members & DiscriminatedUnionValidation<"type", Members>
): DiscriminatedUnionType<"type", Members>;

Defined in: packages/common/src/Type.ts:12196

Discriminated union Type.

With no explicit key, the conventional type property created by typed is used. Pass a key first to discriminate Object Types using a different property.

Every member must be an Object Type with a unique required string, number, bigint, or boolean LiteralType at the discriminator key. Unlike union, only the selected member is decoded, checked, or encoded. The Discriminated Union Input therefore narrows each member's discriminator from its widened Input to the exact literal that selects that member. Use fromUnknown when a value does not yet have that correlated Input type.

Example

import { assertOk, String, discriminatedUnion, typed } from "@evolu/common";

const Created = typed("Created", { id: String });
const Deleted = typed("Deleted", { id: String });
const Event = discriminatedUnion(Created, Deleted);

assertOk(Event.fromUnknown({ type: "Created", id: "id" }), {
  type: "Created",
  id: "id",
});

Call Signature

function discriminatedUnion<Key, Members>(
  key: ValidateDiscriminatedUnionKey<Key>,
  ...members: Members & DiscriminatedUnionValidation<Key, Members>
): DiscriminatedUnionType<Key, Members>;

Defined in: packages/common/src/Type.ts:12231

Creates a Discriminated Union Type with an explicit discriminator key.

Example

import {
  assertOk,
  Number,
  String,
  discriminatedUnion,
  literal,
  object,
} from "@evolu/common";

const Added = object({ kind: literal("added"), value: String });
const Removed = object({ kind: literal("removed"), id: Number });
const Event = discriminatedUnion("kind", Added, Removed);

assertOk(Event.fromUnknown({ kind: "added", value: "Evolu" }), {
  kind: "added",
  value: "Evolu",
});
assertOk(Event.fromUnknown({ kind: "removed", id: 1 }), {
  kind: "removed",
  id: 1,
});