[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Type](https://evolu.dev/docs/api-reference/common/Type) › discriminatedUnion

## Call Signature

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

Defined in: [packages/common/src/Type.ts:12196](https://github.com/evoluhq/evolu/blob/f0109fb501a593010e858e39248dde1200eeb2d7/packages/common/src/Type.ts#L12196)

Discriminated union [Type](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).

With no explicit key, the conventional `type` property created by
[typed](https://evolu.dev/docs/api-reference/common/Type/functions/typed) is used. Pass a key first to discriminate
[Object Types](https://evolu.dev/docs/api-reference/common/Type/type-aliases/ObjectType) using a different property.

Every member must be an Object Type with a unique required string, number,
bigint, or boolean [LiteralType](https://evolu.dev/docs/api-reference/common/Type/interfaces/LiteralType) at the discriminator key. Unlike
[union](https://evolu.dev/docs/api-reference/common/Type/functions/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

```ts

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

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

Defined in: [packages/common/src/Type.ts:12231](https://github.com/evoluhq/evolu/blob/f0109fb501a593010e858e39248dde1200eeb2d7/packages/common/src/Type.ts#L12231)

Creates a Discriminated Union Type with an explicit discriminator key.

### Example

```ts
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,
});
```