[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) › Typed

Defined in: [packages/common/src/Type.ts:11985](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Type.ts#L11985)

A TypeScript interface with a literal `type` property.

Use `Typed` for both domain objects in discriminated unions and plain domain
errors returned by [Result](https://evolu.dev/docs/api-reference/common/Result/type-aliases/Result). Name a domain error interface `XError`.
When `X` already describes a failure, use `X` for its `type` discriminant
because `Error` describes the interface's role rather than the runtime error
kind. Keep `Error` when it is needed to make the discriminant unambiguous,
such as `TimeoutError`.

Typed unions model mutually exclusive states as separate variants instead of
combinations of flags and optional properties. TypeScript narrows a union by
its literal `type` property. To enforce exhaustive handling, return from
every case of a value-producing switch or assert that the remaining value is
`never` in the `default` case of a side-effecting switch.

### Example

```ts
import {
  assertErr,
  assertOk,
  err,
  ok,
  type Result,
  type Typed,
} from "@evolu/common";

interface User extends Typed<"User"> {
  readonly id: string;
}

const getUser = (id: string): Result<User, UserNotFoundError> =>
  id === "user-1"
    ? ok({ type: "User", id })
    : err({ type: "UserNotFound", id });

interface UserNotFoundError extends Typed<"UserNotFound"> {
  readonly id: string;
}

assertOk(getUser("user-1"), { type: "User", id: "user-1" });
assertErr(getUser("missing"), { type: "UserNotFound", id: "missing" });
```

## Extended by

- [`DecryptWithXChaCha20Poly1305Error`](https://evolu.dev/docs/api-reference/common/Crypto/interfaces/DecryptWithXChaCha20Poly1305Error)
- [`FetchTransportError`](https://evolu.dev/docs/api-reference/common/Http/interfaces/FetchTransportError)
- [`FetchStatusError`](https://evolu.dev/docs/api-reference/common/Http/interfaces/FetchStatusError)
- [`FetchBodyError`](https://evolu.dev/docs/api-reference/common/Http/interfaces/FetchBodyError)
- [`Some`](https://evolu.dev/docs/api-reference/common/Option/interfaces/Some)
- [`None`](https://evolu.dev/docs/api-reference/common/Option/interfaces/None)
- [`Done`](https://evolu.dev/docs/api-reference/common/Result/interfaces/Done)
- [`SqlIdentifier`](https://evolu.dev/docs/api-reference/common/Sqlite/interfaces/SqlIdentifier)
- [`RawSql`](https://evolu.dev/docs/api-reference/common/Sqlite/interfaces/RawSql)
- [`RunStateRunning`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RunStateRunning)
- [`RunStateAborted`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RunStateAborted)
- [`RunStateSettled`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RunStateSettled)
- [`RunEventDataChildAdded`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RunEventDataChildAdded)
- [`RunEventDataChildRemoved`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RunEventDataChildRemoved)
- [`RunEventDataStateChanged`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RunEventDataStateChanged)
- [`RetryError`](https://evolu.dev/docs/api-reference/common/Task/interfaces/RetryError)
- [`WebSocketSendError`](https://evolu.dev/docs/api-reference/common/WebSocket/interfaces/WebSocketSendError)
- [`WebSocketConnectError`](https://evolu.dev/docs/api-reference/common/WebSocket/interfaces/WebSocketConnectError)
- [`WebSocketConnectionError`](https://evolu.dev/docs/api-reference/common/WebSocket/interfaces/WebSocketConnectionError)
- [`WebSocketConnectionCloseError`](https://evolu.dev/docs/api-reference/common/WebSocket/interfaces/WebSocketConnectionCloseError)
- [`AppOwner`](https://evolu.dev/docs/api-reference/common/local-first/Owner/interfaces/AppOwner)
- [`ShardOwner`](https://evolu.dev/docs/api-reference/common/local-first/Owner/interfaces/ShardOwner)
- [`SharedOwner`](https://evolu.dev/docs/api-reference/common/local-first/Owner/interfaces/SharedOwner)
- [`SharedReadonlyOwner`](https://evolu.dev/docs/api-reference/common/local-first/Owner/interfaces/SharedReadonlyOwner)
- [`OwnerWebSocketTransport`](https://evolu.dev/docs/api-reference/common/local-first/Owner/interfaces/OwnerWebSocketTransport)
- [`ProtocolHeader`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolHeader)
- [`ProtocolVersionError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolVersionError)
- [`ProtocolInvalidDataError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolInvalidDataError)
- [`ProtocolWriteKeyError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolWriteKeyError)
- [`ProtocolWriteError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolWriteError)
- [`ProtocolQuotaError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolQuotaError)
- [`ProtocolSyncError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolSyncError)
- [`ProtocolTimestampMismatchError`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ProtocolTimestampMismatchError)
- [`ApplyProtocolMessageAsClientResponse`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ApplyProtocolMessageAsClientResponse)
- [`ApplyProtocolMessageAsClientNoResponse`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ApplyProtocolMessageAsClientNoResponse)
- [`ApplyProtocolMessageAsClientBroadcast`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ApplyProtocolMessageAsClientBroadcast)
- [`ApplyProtocolMessageAsRelayResult`](https://evolu.dev/docs/api-reference/common/local-first/Protocol/interfaces/ApplyProtocolMessageAsRelayResult)
- [`StorageQuotaError`](https://evolu.dev/docs/api-reference/common/local-first/Storage/interfaces/StorageQuotaError)
- [`TimestampDriftError`](https://evolu.dev/docs/api-reference/common/local-first/Timestamp/interfaces/TimestampDriftError)
- [`TimestampCounterOverflowError`](https://evolu.dev/docs/api-reference/common/local-first/Timestamp/interfaces/TimestampCounterOverflowError)
- [`TimestampTimeOutOfRangeError`](https://evolu.dev/docs/api-reference/common/local-first/Timestamp/interfaces/TimestampTimeOutOfRangeError)
- [`NodeSignalAbortReason`](https://evolu.dev/docs/api-reference/nodejs/interfaces/NodeSignalAbortReason)
- [`SpawnError`](https://evolu.dev/docs/api-reference/nodejs/interfaces/SpawnError)

## Properties

<a id="type"></a>

### type

```ts
readonly type: Tag;
```

Defined in: [packages/common/src/Type.ts:11986](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Type.ts#L11986)