Skip to content

2. Typed Dataclass

@typed_dataclass gives a standard dataclass the same typed field declarations and class-level references as a schema. It keeps dataclass equality and representation, without adding Pydantic validation.

Run from the repository root:

uv run --extra data-sql python examples/core/02_typed_dataclass.py

Source

"""@typed_dataclass — stdlib @dataclass + Field[T] descriptors.

Same Field[T] declaration ergonomics as BaseSchema, no Pydantic overhead,
no runtime validation. Useful for internal value objects.
"""

from fastsprout.core.decorators import typed_dataclass
from fastsprout.core.fields import Field
from fastsprout.core.fields.field_ref import FieldRef


@typed_dataclass
class Point:
    x: Field[int]
    y: Field[int]
    label: Field[str]


def main() -> None:
    p = Point(x=1, y=2, label="origin-ish")

    assert p.x == 1
    assert p.label == "origin-ish"

    # __eq__ / __repr__ from dataclass still work.
    assert p == Point(x=1, y=2, label="origin-ish")
    assert "Point(x=1" in repr(p)

    # Class-level access returns FieldRef.
    assert isinstance(Point.x, FieldRef)
    assert Point.x.name == "x"

    print(p)


if __name__ == "__main__":
    main()

Result

Point(x=1, y=2, label='origin-ish')