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

```ts
function nextResult<ValueType, ErrorType, DoneType>(
  valueType: ValidateElement<ValueType>,
  errorType: ValidateElement<ErrorType>,
  doneType: ValidateElement<DoneType>,
): DiscriminatedUnionType<"ok">;
```

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

Creates a [Type](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type) for producer Results with value, error, or done
outcomes.

The three outcomes are `Ok<Value>`, `Err<Error>`, and `Err<Typed<"Done"> & {
done: Done }>`. This keeps normal completion distinct from failure while
retaining the ordinary [Result](https://evolu.dev/docs/api-reference/common/Result/type-aliases/Result) shape.

### Example

```ts

const StringNextResult = nextResult(
  String,
  typed("ReadFailed", { message: String }),
  String,
);

const describeNext = (input: unknown): string => {
  const validated = StringNextResult.fromUnknown(input);
  if (!validated.ok) return "Invalid result";

  const result = validated.value;
  if (result.ok) return `Value: ${result.value}`;
  if (result.error.type === "Done") return `Done: ${result.error.done}`;
  return `Error: ${result.error.message}`;
};

assertEqual(describeNext({ ok: true, value: "item" }), "Value: item");
assertEqual(
  describeNext({
    ok: false,
    error: { type: "Done", done: "complete" },
  }),
  "Done: complete",
);
assertEqual(
  describeNext({
    ok: false,
    error: { type: "ReadFailed", message: "Offline" },
  }),
  "Error: Offline",
);
```