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

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

A deferred [Type](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type) with an explicit recursive type declaration.

A Lazy Type exposes one terminal input parent before its definition is
evaluated. Its `from` operation accepts its Output, while `from.parent`
performs the complete conversion from Input to Output. The resolved Type's
intermediate parent suffixes and constructor-specific reflection are
intentionally not exposed.

`FromError` describes `from.parent` failures, `InputError` describes the
synthetic parent's unknown-input failures, and `Errors` describes the
complete `fromUnknown` failures. Keeping those channels explicit makes a
recursive declaration finite for TypeScript while preserving structured
errors at every boundary.

## Extends

- [`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type)\<`"Lazy"`, `Input`, `Output`, `FromError`, [`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type)\<`"Lazy"`, `Input`, `Input`, `InputError`, `null`, `InputError`, `never`, `Input`\>, `Errors`, `never`, `CanonicalInput`, `UsesIdentityEncoding`\>

## Properties

<a id="concretetypesymbol"></a>

### \[concreteTypeSymbol\]

```ts
readonly [concreteTypeSymbol]: true;
```

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

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`[concreteTypeSymbol]`](/docs/api-reference/common/Type/interfaces/Type#concretetypesymbol)

---

<a id="customfromsymbol"></a>

### \[customFromSymbol\]

```ts
readonly [customFromSymbol]: never;
```

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

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`[customFromSymbol]`](/docs/api-reference/common/Type/interfaces/Type#customfromsymbol)

---

<a id="errorssymbol"></a>

### \[errorsSymbol\]

```ts
readonly [errorsSymbol]: Errors;
```

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

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`[errorsSymbol]`](/docs/api-reference/common/Type/interfaces/Type#errorssymbol)

---

<a id="identityencodingsymbol"></a>

### \[identityEncodingSymbol\]

```ts
readonly [identityEncodingSymbol]: UsesIdentityEncoding;
```

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

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`[identityEncodingSymbol]`](/docs/api-reference/common/Type/interfaces/Type#identityencodingsymbol)

---

<a id="lazytypesymbol"></a>

### \[lazyTypeSymbol\]

```ts
readonly [lazyTypeSymbol]: true;
```

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

---

<a id="standard"></a>

### ~standard

```ts
readonly ~standard: Props<Input, Output>;
```

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

Standard Schema V1 interoperability.

Validation runs the complete `fromUnknown` pipeline synchronously and
reports every structured failure as a localized message with a separate
property path.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`~standard`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#standard)

---

<a id="canonicalinput-1"></a>

### CanonicalInput

```ts
CanonicalInput: CanonicalInput;
```

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

The statically known subtype of [Input](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#input) returned by the complete `to`
operation.

Compared with Input, CanonicalInput can exclude invalid candidates and
alternative representations that encoding cannot emit. It can remain wider
than the values actually emitted when a refinement follows an arbitrary
transformation. Structural Types derive it from the CanonicalInput of their
contained Types.

This is a type-only phantom property. Use it through `typeof
Type.CanonicalInput`; it does not exist at runtime.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`CanonicalInput`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#canonicalinput)

---

<a id="error"></a>

### Error

```ts
Error: FromError;
```

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

The error introduced at this Type node.

This is a type-only phantom property. Use it through `typeof Type.Error`;
it does not exist at runtime.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`Error`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#error)

---

<a id="formaterror"></a>

### formatError

```ts
readonly formatError: TypeErrorFormatter<FromError | Errors>;
```

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

Formats an error returned by any Lazy Type decoding operation.

#### Overrides

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`formatError`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#formaterror)

---

<a id="from"></a>

### from

```ts
readonly from: FromOperation<Output, FromError, Type<"Lazy", Input, Input, InputError, null, InputError, never, Input, true>>;
```

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

Runs the remaining Type pipeline from a typed boundary.

`from` accepts this Type's `Output`. Its first `.parent` accepts the
immediate parent Output, and each additional suffix moves the boundary one
Type toward the root. The deepest suffix accepts the root Output.

Every entry point asserts its selected boundary before running the
remaining pipeline. Assertion failures throw because they indicate a
developer error. The Error message identifies the expected boundary Type,
and its cause preserves the structured validation error. Only failures
introduced after that boundary are returned through `Result`.

### Example

A form already guarantees every constraint on a title, while a new note
input guarantees only trimmed text. The note's parent boundary validates
only the constraints that the form does not guarantee:

```ts
import {
  assertOk,
  assertType,
  flatMapResult,
  NonEmptyTrimmedString100,
  object,
  TrimmedString,
  type MaxLengthError,
  type MinLengthError,
  type Result,
} from "@evolu/common";

const Todo = object({
  title: NonEmptyTrimmedString100,
  note: NonEmptyTrimmedString100,
});

const saveTodo = (title: NonEmptyTrimmedString100, note: TrimmedString) => {
  // @ts-expect-error TrimmedString does not guarantee a non-empty value
  // with at most 100 characters.
  Todo.from({ title, note });

  return flatMapResult(Todo.props.note.from.parent.parent(note), (note) =>
    Todo.from({ title, note }),
  );
};

const title = NonEmptyTrimmedString100.orThrow("Buy milk");
const note = TrimmedString.orThrow("Remember oat milk");
const result = saveTodo(title, note);

assertType<
  Result<typeof Todo.Output, MaxLengthError<100> | MinLengthError<1>>,
  typeof result
>();
assertOk(result, { title, note });
```

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`from`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#from)

---

<a id="fromunknown"></a>

### fromUnknown

```ts
readonly fromUnknown: (value: unknown, options?: ValidationOptions) => Result<Output, Errors>;
```

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

Decodes an unknown value through the complete Type pipeline.

### Example

```ts

const value: unknown = 42;
const result = PositiveInt.fromUnknown(value);

assertOk(result, 42);
```

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`fromUnknown`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#fromunknown)

---

<a id="input-1"></a>

### Input

```ts
Input: Input;
```

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

The complete typed decoding boundary accepted by `orThrow`, `orNull`, and
the deepest available `from` operation.

Input includes candidates that validation can reject and noncanonical
representations that decoding can normalize.

This is a type-only phantom property. Use it through `typeof Type.Input`;
it does not exist at runtime.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`Input`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#input)

---

<a id="is"></a>

### is

```ts
readonly is: (value: unknown) => value is Output;
```

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

Checks whether an unknown value is a valid semantic `Output`.

This is an exact Output-membership check, not a test of whether an encoded
Input could be decoded. It can be used directly as a TypeScript type guard,
including as an Array filter predicate.

### Example

```ts
import {
  assertFalse,
  assertType,
  assertTrue,
  Int64FromInt64String,
  type Int64,
} from "@evolu/common";

const values: ReadonlyArray<unknown> = [42n, "42", null];
const integers = values.filter(Int64FromInt64String.is);

assertType<Array<Int64>, typeof integers>();
assertTrue(Int64FromInt64String.is(42n));
assertFalse(Int64FromInt64String.is("42"));
```

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`is`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#is)

---

<a id="name"></a>

### name

```ts
readonly name: "Lazy";
```

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

The name identifying this Type node.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`name`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#name-1)

---

<a id="ornull"></a>

### orNull

```ts
readonly orNull: (value: Input) => Output | null;
```

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

Shorthand for calling [getOrNull](https://evolu.dev/docs/api-reference/common/Result/functions/getOrNull) with the result of the deepest
`from` operation, which accepts this Type's `Input`.

The typed `Input` boundary is asserted before the remaining pipeline runs.
A boundary violation throws a developer error directly; `getOrNull` maps
only a validation error returned after that boundary to `null`.

`Type.orNull.parent(value)` does not exist. To return `null` after starting
from a typed boundary, call `getOrNull` with the corresponding `from`
operation.

Use `orNull` when absence is the complete meaning of failure and the error
is intentionally irrelevant. Use `fromUnknown` or a typed `from` operation
when the caller needs to inspect, format, or otherwise handle the error.

### Example

```ts

const NonEmptyString = minLength(1)(String);

const value = NonEmptyString.orNull("Evolu");

// Equivalent because `from.parent` is this Type's deepest `from` operation:
const sameValue = getOrNull(NonEmptyString.from.parent("Evolu"));

assertEqual(value, "Evolu");
assertEqual(sameValue, value);
assertEqual(NonEmptyString.orNull(""), null);
```

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`orNull`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#ornull)

---

<a id="orthrow"></a>

### orThrow

```ts
readonly orThrow: (value: Input, options?: ValidationOptions) => Output;
```

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

Shorthand for calling [getOrThrow](https://evolu.dev/docs/api-reference/common/Result/functions/getOrThrow) with the result of the deepest
`from` operation, which accepts this Type's `Input`.

The typed `Input` boundary is asserted before the remaining pipeline runs.
A boundary violation throws a developer error directly; `getOrThrow` maps
only a validation error returned after that boundary.

`Type.orThrow.parent(value)` does not exist. To throw after starting from a
typed boundary, call `getOrThrow` with the corresponding `from` operation.

Use `orThrow` for startup and configuration, module constants, test
fixtures, and internal invariants where failure must stop the current flow.
Prefer `fromUnknown` or a typed `from` operation for ordinary application
input whose validation failure can be reported or recovered from.

### Example

```ts

const NonEmptyString = minLength(1)(String);

const value = NonEmptyString.orThrow("Evolu");

// Equivalent because `from.parent` is this Type's deepest `from` operation:
const sameValue = getOrThrow(NonEmptyString.from.parent("Evolu"));

assertEqual(value, "Evolu");
assertEqual(sameValue, value);
```

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`orThrow`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#orthrow)

---

<a id="output-1"></a>

### Output

```ts
Output: Output;
```

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

The semantic value produced by decoding and accepted by bare `from` and
`to`.

This is a type-only phantom property. Use it through `typeof Type.Output`;
it does not exist at runtime.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`Output`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#output)

---

<a id="parent"></a>

### parent

```ts
readonly parent: Type;
```

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

The one preceding Type node, or `null` for a root Type.

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`parent`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#parent-1)

---

<a id="to"></a>

### to

```ts
readonly to: ToOperation<Output, CanonicalInput, Type<"Lazy", Input, Input, InputError, null, InputError, never, Input, true>>;
```

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

Asserts and encodes an `Output` toward its canonical `Input`
representation.

`to` runs the complete encoding pipeline. Its first `.parent` stops at the
immediate parent Output, and each additional suffix stops one Type closer
to the root. Every entry point accepts this Type's `Output`.

### Example

```ts

const value = Int64.orThrow(42n);

assertEqual(Int64FromInt64String.to(value), "42");
```

#### Inherited from

[`Type`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).[`to`](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type#to)