EdgeAIG's picture
download
raw
33.4 kB
/**
* Defines helpers for small immutable data models.
*
* This module helps create plain classes, tagged classes, tagged unions, and
* typed errors with readonly fields. Tagged values carry a `_tag` field, which
* makes them easy to narrow with pattern matching or simple checks. These
* helpers are commonly used for domain values and errors in Effect programs.
*
* @since 2.0.0
*/
import type * as Cause from "./Cause.ts";
import * as Pipeable from "./Pipeable.ts";
import type * as Types from "./Types.ts";
import type { Unify } from "./Unify.ts";
/**
* Provides a base class for immutable data types.
*
* **When to use**
*
* Use when you need a lightweight immutable value type with `.pipe()` support.
*
* **Details**
*
* Extend `Class` with a type parameter to declare fields. The constructor
* accepts those fields as a single object argument. When there are no fields
* the argument is optional. Instances are `Readonly` and `Pipeable`.
*
* **Example** (Defining a value class)
*
* ```ts
* import { Data, Equal } from "effect"
*
* class Person extends Data.Class<{ readonly name: string }> {}
*
* const mike1 = new Person({ name: "Mike" })
* const mike2 = new Person({ name: "Mike" })
*
* console.log(Equal.equals(mike1, mike2))
* // true
* ```
*
* @see {@link TaggedClass} — adds a `_tag` field
* @see {@link Error} — yieldable error variant
*
* @category constructors
* @since 2.0.0
*/
export declare const Class: new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{
readonly [P in keyof A]: A[P];
}>) => Readonly<A> & Pipeable.Pipeable;
/**
* Provides a base class for immutable data types with a `_tag` discriminator.
*
* **When to use**
*
* Use when you need a single-variant tagged type or an ad-hoc discriminator.
*
* **Details**
*
* Like {@link Class}, but the resulting instances also carry a
* `readonly _tag: Tag` property. The `_tag` is excluded from the constructor
* argument.
*
* **Example** (Defining a tagged class)
*
* ```ts
* import { Data } from "effect"
*
* class Person extends Data.TaggedClass("Person")<{
* readonly name: string
* }> {}
*
* const mike = new Person({ name: "Mike" })
* console.log(mike._tag)
* // "Person"
* ```
*
* @see {@link Class} — without a `_tag`
* @see {@link TaggedError} — tagged error variant
* @see {@link TaggedEnum} — multi-variant unions
*
* @category constructors
* @since 2.0.0
*/
export declare const TaggedClass: <Tag extends string>(tag: Tag) => new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Readonly<A> & {
readonly _tag: Tag;
} & Pipeable.Pipeable;
/**
* Transforms a record of variant definitions into a discriminated union type.
*
* **When to use**
*
* Use when you have two or more variants that share a common `_tag` discriminator.
*
* **Details**
*
* Each key in the record becomes a variant with `readonly _tag` set to that
* key. Use with {@link taggedEnum} to get constructors and matchers.
*
* **Gotchas**
*
* Variant records must **not** include a `_tag` property; it is added automatically.
*
* **Example** (Defining a tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly status: 400; readonly message: string }
* NotFound: { readonly status: 404 }
* }>
*
* // Equivalent to:
* // | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* // | { readonly _tag: "NotFound"; readonly status: 404 }
*
* const { BadRequest, NotFound } = Data.taggedEnum<HttpError>()
*
* const err = BadRequest({ status: 400, message: "missing id" })
* console.log(err._tag)
* // "BadRequest"
* ```
*
* @see {@link taggedEnum} — constructors and matchers for a `TaggedEnum`
* @see {@link TaggedEnum.WithGenerics} — generic tagged enums
* @see {@link TaggedEnum.Constructor} — the constructor object type
*
* @category models
* @since 2.0.0
*/
export type TaggedEnum<A extends Record<string, Record<string, any>> & UntaggedChildren<A>> = keyof A extends infer Tag ? Tag extends keyof A ? Types.Simplify<{
readonly _tag: Tag;
} & {
readonly [K in keyof A[Tag]]: A[Tag][K];
}> : never : never;
type ChildrenAreTagged<A> = keyof A extends infer K ? K extends keyof A ? "_tag" extends keyof A[K] ? true : false : never : never;
type UntaggedChildren<A> = true extends ChildrenAreTagged<A> ? "It looks like you're trying to create a tagged enum, but one or more of its members already has a `_tag` property." : unknown;
/**
* Namespace for `TaggedEnum` utility types.
*
* **When to use**
*
* Use to reference utility types for constructing, extracting, and matching
* `TaggedEnum` variants.
*
* **Details**
*
* Provides helper types for:
* - Generic tagged enums ({@link TaggedEnum.WithGenerics}, {@link TaggedEnum.Kind})
* - Extracting constructor arguments ({@link TaggedEnum.Args}) and variant
* values ({@link TaggedEnum.Value})
* - Full constructor objects ({@link TaggedEnum.Constructor})
*
* @since 2.0.0
*/
export declare namespace TaggedEnum {
/**
* Defines a tagged enum shape that accepts generic type parameters.
*
* **When to use**
*
* Use when variant payloads need to be parameterized, such as `Result<E, A>`.
*
* **Details**
*
* Extend this interface and set `taggedEnum` to your union type, using
* `this["A"]`, `this["B"]`, etc. as placeholders for the generics. The
* `Count` parameter declares how many generics are used (up to 4).
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
*
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
*
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link Kind} — apply concrete types to a `WithGenerics` definition
* @see {@link taggedEnum} — constructors and matchers
*
* @category models
* @since 2.0.0
*/
interface WithGenerics<Count extends number> {
readonly taggedEnum: {
readonly _tag: string;
};
readonly numberOfGenerics: Count;
readonly A: unknown;
readonly B: unknown;
readonly C: unknown;
readonly D: unknown;
}
/**
* Applies concrete type arguments to a `WithGenerics` definition, producing
* the resulting tagged union type.
*
* **When to use**
*
* Use to refer to a specific instantiation of a generic tagged enum in type signatures.
*
* **Example** (Applying generics)
*
* ```ts
* import type { Data } from "effect"
*
* type Option<A> = Data.TaggedEnum<{
* None: {}
* Some: { readonly value: A }
* }>
* interface OptionDef extends Data.TaggedEnum.WithGenerics<1> {
* readonly taggedEnum: Option<this["A"]>
* }
*
* // Resolve to the concrete union for `string`
* type StringOption = Data.TaggedEnum.Kind<OptionDef, string>
* // { _tag: "None" } | { _tag: "Some"; value: string }
* ```
*
* @see {@link WithGenerics} — define the generic shape
*
* @category utility types
* @since 2.0.0
*/
type Kind<Z extends WithGenerics<number>, A = unknown, B = unknown, C = unknown, D = unknown> = (Z & {
readonly A: A;
readonly B: B;
readonly C: C;
readonly D: D;
})["taggedEnum"];
/**
* Extracts the constructor argument type for a specific variant of a tagged
* union.
*
* **When to use**
*
* Use to derive the argument object expected by a constructor for one tagged
* union variant.
*
* **Details**
*
* Returns `void` if the variant has no fields beyond `_tag`.
*
* **Example** (Extracting variant args)
*
* ```ts
* import type { Data } from "effect"
*
* type Result =
* | { readonly _tag: "Ok"; readonly value: number }
* | { readonly _tag: "Err"; readonly error: string }
*
* type OkArgs = Data.TaggedEnum.Args<Result, "Ok">
* // { readonly value: number }
*
* type ErrArgs = Data.TaggedEnum.Args<Result, "Err">
* // { readonly error: string }
* ```
*
* @see {@link Value} — extracts the full variant type (including `_tag`)
*
* @category utility types
* @since 2.0.0
*/
type Args<A extends {
readonly _tag: string;
}, K extends A["_tag"], E = Extract<A, {
readonly _tag: K;
}>> = {
readonly [K in keyof E as K extends "_tag" ? never : K]: E[K];
} extends infer T ? Types.VoidIfEmpty<T> : never;
/**
* Extracts the full variant type (including `_tag`) for a specific tag.
*
* **When to use**
*
* Use to select one full tagged-union variant by its `_tag` value.
*
* **Example** (extracting a variant type)
*
* ```ts
* import type { Data } from "effect"
*
* type Result =
* | { readonly _tag: "Ok"; readonly value: number }
* | { readonly _tag: "Err"; readonly error: string }
*
* type OkVariant = Data.TaggedEnum.Value<Result, "Ok">
* // { readonly _tag: "Ok"; readonly value: number }
* ```
*
* @see {@link Args} — extracts fields without `_tag`
*
* @category utility types
* @since 2.0.0
*/
type Value<A extends {
readonly _tag: string;
}, K extends A["_tag"]> = Extract<A, {
readonly _tag: K;
}>;
/**
* The full constructors-and-matchers object type returned by {@link taggedEnum}.
*
* **When to use**
*
* Use when you want to annotate an exported constructor bundle so downstream
* code keeps exact variant constructors and exhaustive matching.
*
* **Details**
*
* Includes:
* - A constructor function for each variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard that checks only the `_tag` field;
* safe when the tag is globally unique and the value was produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
* - `$match` — exhaustive pattern matching (data-last or data-first)
*
* **Example** (Using the constructor object)
*
* ```ts
* import { Data } from "effect"
*
* type Shape =
* | { readonly _tag: "Circle"; readonly radius: number }
* | { readonly _tag: "Rect"; readonly w: number; readonly h: number }
*
* const { Circle, Rect, $is, $match } = Data.taggedEnum<Shape>()
*
* const shape = Circle({ radius: 10 })
*
* // Type guard
* if ($is("Circle")(shape)) {
* console.log(shape.radius)
* }
*
* // Pattern matching
* const label = $match(shape, {
* Circle: (s) => `circle r=${s.radius}`,
* Rect: (s) => `rect ${s.w}x${s.h}`
* })
* ```
*
* @see {@link taggedEnum} — creates constructors and matchers
*
* @category types
* @since 3.1.0
*/
type Constructor<A extends {
readonly _tag: string;
}> = Types.Simplify<{
readonly [Tag in A["_tag"]]: ConstructorFrom<Extract<A, {
readonly _tag: Tag;
}>, "_tag">;
} & {
readonly $is: <Tag extends A["_tag"]>(tag: Tag) => (u: unknown) => u is Extract<A, {
readonly _tag: Tag;
}>;
readonly $match: {
<Cases extends {
readonly [Tag in A["_tag"]]: (args: Extract<A, {
readonly _tag: Tag;
}>) => any;
}>(cases: Cases): (value: A) => Unify<ReturnType<Cases[A["_tag"]]>>;
<Cases extends {
readonly [Tag in A["_tag"]]: (args: Extract<A, {
readonly _tag: Tag;
}>) => any;
}>(value: A, cases: Cases): Unify<ReturnType<Cases[A["_tag"]]>>;
};
}>;
/**
* Function type that constructs a tagged-union variant from its fields,
* excluding the keys listed in `Tag`.
*
* **When to use**
*
* Use to type an individual constructor for one tagged-union variant.
*
* **Details**
*
* The constructor returns the full variant type `A`. If no fields remain
* after excluding `Tag` keys, the constructor argument type becomes `void`.
*
* @category utility types
* @since 4.0.0
*/
type ConstructorFrom<A, Tag extends keyof A = never> = (args: Types.VoidIfEmpty<{
readonly [P in keyof A as P extends Tag ? never : P]: A[P];
}>) => A;
/**
* Type-guard and pattern-matching interface for generic tagged enums.
*
* **When to use**
*
* Use to type the `$is` and `$match` helpers for generic tagged enums.
*
* **Details**
*
* This is the `$is` / `$match` portion of the object returned by
* {@link taggedEnum} when used with a {@link WithGenerics} definition.
*
* @see {@link Constructor} — the non-generic equivalent
*
* @category models
* @since 3.2.0
*/
interface GenericMatchers<Z extends WithGenerics<number>> {
readonly $is: <Tag extends Z["taggedEnum"]["_tag"]>(tag: Tag) => {
<T extends TaggedEnum.Kind<Z, any, any, any, any>>(u: T): u is T & {
readonly _tag: Tag;
};
(u: unknown): u is Extract<TaggedEnum.Kind<Z>, {
readonly _tag: Tag;
}>;
};
readonly $match: {
<A, B, C, D, Cases extends {
readonly [Tag in Z["taggedEnum"]["_tag"]]: (args: Extract<TaggedEnum.Kind<Z, A, B, C, D>, {
readonly _tag: Tag;
}>) => any;
}>(cases: Cases): (self: TaggedEnum.Kind<Z, A, B, C, D>) => Unify<ReturnType<Cases[Z["taggedEnum"]["_tag"]]>>;
<A, B, C, D, Cases extends {
readonly [Tag in Z["taggedEnum"]["_tag"]]: (args: Extract<TaggedEnum.Kind<Z, A, B, C, D>, {
readonly _tag: Tag;
}>) => any;
}>(self: TaggedEnum.Kind<Z, A, B, C, D>, cases: Cases): Unify<ReturnType<Cases[Z["taggedEnum"]["_tag"]]>>;
};
}
}
/**
* Creates constructors and matchers for a `TaggedEnum` type.
*
* **When to use**
*
* Use when you model a closed union with plain data objects and want
* construction, tag checks, and exhaustive matching from the same definition.
*
* **Details**
*
* Returns an object with:
* - One constructor per variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard function that checks only the `_tag` field
* - `$match` — exhaustive pattern matching (data-first or data-last)
*
* **Gotchas**
*
* - Constructors produce **plain objects**, not class instances.
* - `$is(tag)` only checks the `_tag` field, not the full structure. It relies
* on the tag being globally unique and the value being produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
*
* **Example** (Basic usage)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly message: string }
* NotFound: { readonly url: string }
* }>
*
* const { BadRequest, NotFound, $is, $match } = Data.taggedEnum<HttpError>()
*
* const err = NotFound({ url: "/missing" })
*
* // Type guard
* console.log($is("NotFound")(err)) // true
*
* // Pattern matching
* const msg = $match(err, {
* BadRequest: (e) => e.message,
* NotFound: (e) => `${e.url} not found`
* })
* console.log(msg) // "/missing not found"
* ```
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link TaggedEnum} — the type-level companion
* @see {@link TaggedEnum.Constructor} — the returned object type
* @see {@link TaggedEnum.WithGenerics} — generic enum support
*
* @category constructors
* @since 2.0.0
*/
export declare const taggedEnum: {
/**
* Creates constructors and matchers for a `TaggedEnum` type.
*
* **When to use**
*
* Use when you model a closed union with plain data objects and want
* construction, tag checks, and exhaustive matching from the same definition.
*
* **Details**
*
* Returns an object with:
* - One constructor per variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard function that checks only the `_tag` field
* - `$match` — exhaustive pattern matching (data-first or data-last)
*
* **Gotchas**
*
* - Constructors produce **plain objects**, not class instances.
* - `$is(tag)` only checks the `_tag` field, not the full structure. It relies
* on the tag being globally unique and the value being produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
*
* **Example** (Basic usage)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly message: string }
* NotFound: { readonly url: string }
* }>
*
* const { BadRequest, NotFound, $is, $match } = Data.taggedEnum<HttpError>()
*
* const err = NotFound({ url: "/missing" })
*
* // Type guard
* console.log($is("NotFound")(err)) // true
*
* // Pattern matching
* const msg = $match(err, {
* BadRequest: (e) => e.message,
* NotFound: (e) => `${e.url} not found`
* })
* console.log(msg) // "/missing not found"
* ```
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link TaggedEnum} — the type-level companion
* @see {@link TaggedEnum.Constructor} — the returned object type
* @see {@link TaggedEnum.WithGenerics} — generic enum support
*
* @category constructors
* @since 2.0.0
*/
<Z extends TaggedEnum.WithGenerics<1>>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: <A>(args: TaggedEnum.Args<TaggedEnum.Kind<Z, A>, Tag, Extract<TaggedEnum.Kind<Z, A>, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value<TaggedEnum.Kind<Z, A>, Tag>;
} & TaggedEnum.GenericMatchers<Z>>;
/**
* Creates constructors and matchers for a `TaggedEnum` type.
*
* **When to use**
*
* Use when you model a closed union with plain data objects and want
* construction, tag checks, and exhaustive matching from the same definition.
*
* **Details**
*
* Returns an object with:
* - One constructor per variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard function that checks only the `_tag` field
* - `$match` — exhaustive pattern matching (data-first or data-last)
*
* **Gotchas**
*
* - Constructors produce **plain objects**, not class instances.
* - `$is(tag)` only checks the `_tag` field, not the full structure. It relies
* on the tag being globally unique and the value being produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
*
* **Example** (Basic usage)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly message: string }
* NotFound: { readonly url: string }
* }>
*
* const { BadRequest, NotFound, $is, $match } = Data.taggedEnum<HttpError>()
*
* const err = NotFound({ url: "/missing" })
*
* // Type guard
* console.log($is("NotFound")(err)) // true
*
* // Pattern matching
* const msg = $match(err, {
* BadRequest: (e) => e.message,
* NotFound: (e) => `${e.url} not found`
* })
* console.log(msg) // "/missing not found"
* ```
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link TaggedEnum} — the type-level companion
* @see {@link TaggedEnum.Constructor} — the returned object type
* @see {@link TaggedEnum.WithGenerics} — generic enum support
*
* @category constructors
* @since 2.0.0
*/
<Z extends TaggedEnum.WithGenerics<2>>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: <A, B>(args: TaggedEnum.Args<TaggedEnum.Kind<Z, A, B>, Tag, Extract<TaggedEnum.Kind<Z, A, B>, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value<TaggedEnum.Kind<Z, A, B>, Tag>;
} & TaggedEnum.GenericMatchers<Z>>;
/**
* Creates constructors and matchers for a `TaggedEnum` type.
*
* **When to use**
*
* Use when you model a closed union with plain data objects and want
* construction, tag checks, and exhaustive matching from the same definition.
*
* **Details**
*
* Returns an object with:
* - One constructor per variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard function that checks only the `_tag` field
* - `$match` — exhaustive pattern matching (data-first or data-last)
*
* **Gotchas**
*
* - Constructors produce **plain objects**, not class instances.
* - `$is(tag)` only checks the `_tag` field, not the full structure. It relies
* on the tag being globally unique and the value being produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
*
* **Example** (Basic usage)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly message: string }
* NotFound: { readonly url: string }
* }>
*
* const { BadRequest, NotFound, $is, $match } = Data.taggedEnum<HttpError>()
*
* const err = NotFound({ url: "/missing" })
*
* // Type guard
* console.log($is("NotFound")(err)) // true
*
* // Pattern matching
* const msg = $match(err, {
* BadRequest: (e) => e.message,
* NotFound: (e) => `${e.url} not found`
* })
* console.log(msg) // "/missing not found"
* ```
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link TaggedEnum} — the type-level companion
* @see {@link TaggedEnum.Constructor} — the returned object type
* @see {@link TaggedEnum.WithGenerics} — generic enum support
*
* @category constructors
* @since 2.0.0
*/
<Z extends TaggedEnum.WithGenerics<3>>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: <A, B, C>(args: TaggedEnum.Args<TaggedEnum.Kind<Z, A, B, C>, Tag, Extract<TaggedEnum.Kind<Z, A, B, C>, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value<TaggedEnum.Kind<Z, A, B, C>, Tag>;
} & TaggedEnum.GenericMatchers<Z>>;
/**
* Creates constructors and matchers for a `TaggedEnum` type.
*
* **When to use**
*
* Use when you model a closed union with plain data objects and want
* construction, tag checks, and exhaustive matching from the same definition.
*
* **Details**
*
* Returns an object with:
* - One constructor per variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard function that checks only the `_tag` field
* - `$match` — exhaustive pattern matching (data-first or data-last)
*
* **Gotchas**
*
* - Constructors produce **plain objects**, not class instances.
* - `$is(tag)` only checks the `_tag` field, not the full structure. It relies
* on the tag being globally unique and the value being produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
*
* **Example** (Basic usage)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly message: string }
* NotFound: { readonly url: string }
* }>
*
* const { BadRequest, NotFound, $is, $match } = Data.taggedEnum<HttpError>()
*
* const err = NotFound({ url: "/missing" })
*
* // Type guard
* console.log($is("NotFound")(err)) // true
*
* // Pattern matching
* const msg = $match(err, {
* BadRequest: (e) => e.message,
* NotFound: (e) => `${e.url} not found`
* })
* console.log(msg) // "/missing not found"
* ```
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link TaggedEnum} — the type-level companion
* @see {@link TaggedEnum.Constructor} — the returned object type
* @see {@link TaggedEnum.WithGenerics} — generic enum support
*
* @category constructors
* @since 2.0.0
*/
<Z extends TaggedEnum.WithGenerics<4>>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: <A, B, C, D>(args: TaggedEnum.Args<TaggedEnum.Kind<Z, A, B, C, D>, Tag, Extract<TaggedEnum.Kind<Z, A, B, C, D>, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value<TaggedEnum.Kind<Z, A, B, C, D>, Tag>;
} & TaggedEnum.GenericMatchers<Z>>;
/**
* Creates constructors and matchers for a `TaggedEnum` type.
*
* **When to use**
*
* Use when you model a closed union with plain data objects and want
* construction, tag checks, and exhaustive matching from the same definition.
*
* **Details**
*
* Returns an object with:
* - One constructor per variant (keyed by tag name)
* - `$is(tag)` — returns a type-guard function that checks only the `_tag` field
* - `$match` — exhaustive pattern matching (data-first or data-last)
*
* **Gotchas**
*
* - Constructors produce **plain objects**, not class instances.
* - `$is(tag)` only checks the `_tag` field, not the full structure. It relies
* on the tag being globally unique and the value being produced by your
* constructors. For untrusted input, validate with the `Schema` module first.
*
* **Example** (Basic usage)
*
* ```ts
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly message: string }
* NotFound: { readonly url: string }
* }>
*
* const { BadRequest, NotFound, $is, $match } = Data.taggedEnum<HttpError>()
*
* const err = NotFound({ url: "/missing" })
*
* // Type guard
* console.log($is("NotFound")(err)) // true
*
* // Pattern matching
* const msg = $match(err, {
* BadRequest: (e) => e.message,
* NotFound: (e) => `${e.url} not found`
* })
* console.log(msg) // "/missing not found"
* ```
*
* **Example** (Generic tagged enum)
*
* ```ts
* import { Data } from "effect"
*
* type MyResult<E, A> = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDef extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult<this["A"], this["B"]>
* }
* const { Failure, Success } = Data.taggedEnum<MyResultDef>()
*
* const ok = Success({ value: 42 })
* // ok: { readonly _tag: "Success"; readonly value: number }
* ```
*
* @see {@link TaggedEnum} — the type-level companion
* @see {@link TaggedEnum.Constructor} — the returned object type
* @see {@link TaggedEnum.WithGenerics} — generic enum support
*
* @category constructors
* @since 2.0.0
*/
<A extends {
readonly _tag: string;
}>(): TaggedEnum.Constructor<A>;
};
/**
* Provides a base class for yieldable errors.
*
* **When to use**
*
* Use when you need yieldable errors that do **not** need tag-based
* discrimination.
*
* **Details**
*
* Extends `Cause.YieldableError`, so instances can be yielded inside
* `Effect.gen` to fail the enclosing effect. Fields are passed as a single
* object; when there are no fields the argument is optional. If a `message`
* field is provided, it becomes the error's `.message`.
*
* **Example** (Defining a yieldable error)
*
* ```ts
* import { Data, Effect } from "effect"
*
* class NetworkError extends Data.Error<{
* readonly code: number
* readonly message: string
* }> {}
*
* const program = Effect.gen(function*() {
* return yield* new NetworkError({ code: 500, message: "timeout" })
* })
*
* // The effect fails with a NetworkError
* Effect.runSync(Effect.exit(program))
* ```
*
* @see {@link TaggedError} — adds a `_tag` for `Effect.catchTag`
* @see {@link Class} — non-error data class
*
* @category constructors
* @since 2.0.0
*/
export declare const Error: new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{
readonly [P in keyof A]: A[P];
}>) => Cause.YieldableError & Readonly<A>;
/**
* Creates a tagged error class with a `_tag` discriminator.
*
* **When to use**
*
* Use when you need domain errors with discriminated-union handling.
*
* **Details**
*
* Like {@link Error}, but instances also carry a `readonly _tag` property,
* enabling `Effect.catchTag` and `Effect.catchTags` for tag-based recovery.
* The `_tag` is excluded from the constructor argument. Yielding an instance
* inside `Effect.gen` fails the effect with this error.
*
* **Example** (Tag-based error recovery)
*
* ```ts
* import { Data, Effect } from "effect"
*
* class NotFound extends Data.TaggedError("NotFound")<{
* readonly resource: string
* }> {}
*
* class Forbidden extends Data.TaggedError("Forbidden")<{
* readonly reason: string
* }> {}
*
* const program = Effect.gen(function*() {
* return yield* new NotFound({ resource: "/users/42" })
* })
*
* const recovered = program.pipe(
* Effect.catchTag("NotFound", (e) =>
* Effect.succeed(`missing: ${e.resource}`))
* )
* ```
*
* @see {@link Error} — without a `_tag`
* @see {@link TaggedClass} — tagged class that is not an error
*
* @category constructors
* @since 2.0.0
*/
export declare const TaggedError: <Tag extends string>(tag: Tag) => new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{
readonly [P in keyof A as P extends "_tag" ? never : P]: A[P];
}>) => Cause.YieldableError & {
readonly _tag: Tag;
} & Readonly<A>;
export {};
//# sourceMappingURL=Data.d.ts.map

Xet Storage Details

Size:
33.4 kB
·
Xet hash:
cb2b6140853c88bb80a04f0a8778d5e575d84ec9e76b9cc68e58b5fd0ef94702

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.