Types API
Type definitions and interfaces used throughout the Ascender Framework.
Provider Types
Base Provider
from typing import TypedDict, Any, Callable
class Provider(TypedDict, total=False):
    """Base provider type."""
    provide: Any
    multi: bool
Class Provider
Value Provider
Factory Provider
class FactoryProvider(Provider):
    """Factory function provider."""
    useFactory: Callable[..., Any]
    inject: list[Any] | None
Existing Provider
Route Types
Route Configuration
class RouteConfig(TypedDict):
    """Route configuration."""
    path: str
    method: str
    handler: Callable
    response_model: type | None
    status_code: int
    tags: list[str]
    summary: str | None
    description: str | None
    deprecated: bool
Route Parameter
class RouteParam(TypedDict):
    """Route parameter configuration."""
    name: str
    type: type
    default: Any
    required: bool
    description: str | None
Module Types
Module Configuration
class ModuleConfig(TypedDict, total=False):
    """Module configuration."""
    providers: list[Provider | type]
    controllers: list[type]
    imports: list[type]
    exports: list[str | type]
Module Metadata
class ModuleMetadata(TypedDict):
    """Module metadata."""
    token: str
    providers: list[Provider]
    controllers: list[type]
    imports: list[str]
    exports: list[str]
Dependency Injection Types
Injection Token
Provider Record
from dataclasses import dataclass
from typing import Generic, TypeVar, Callable
T = TypeVar('T')
@dataclass
class ProviderRecord(Generic[T]):
    """Provider record in DI container."""
    value: T
    factory: Callable[[], T] | None
    multi: bool
Forward Reference
class DependencyForwardRef(Generic[T]):
    """Forward reference for circular dependencies."""
    def __init__(self, resolver: Callable[[], T]):
        self._resolver = resolver
        self._resolved = False
        self._value: T | None = None
    def resolve(self) -> T:
        """Resolve the forward reference."""
        if not self._resolved:
            self._value = self._resolver()
            self._resolved = True
        return self._value
HTTP Types
HTTP Method
from typing import Literal
HttpMethod = Literal[
    "GET", "POST", "PUT", "PATCH", "DELETE",
    "OPTIONS", "HEAD", "TRACE"
]
Request Context
from starlette.requests import Request
from starlette.responses import Response
HttpRequest = Request
HttpResponse = Response
Middleware Types
Middleware Function
from typing import Awaitable, Callable
from starlette.requests import Request
Middleware = Callable[[Request, Callable], Awaitable[Response]]
Middleware Configuration
class MiddlewareConfig(TypedDict):
    """Middleware configuration."""
    middleware: type
    options: dict[str, Any]
CLI Types
Command Configuration
class CommandConfig(TypedDict):
    """CLI command configuration."""
    name: str
    description: str | None
    help: str | None
Handler Configuration
class HandlerConfig(TypedDict):
    """CLI handler configuration."""
    name: str
    description: str | None
    is_coroutine: bool
Parameter Configuration
class ParameterConfig(TypedDict, total=False):
    """CLI parameter configuration."""
    default: Any
    required: bool
    description: str | None
    type: type
    choices: list[Any]
Database Types
Database Configuration
class DatabaseConfig(TypedDict, total=False):
    """Database configuration."""
    url: str
    echo: bool
    pool_size: int
    max_overflow: int
    pool_timeout: float
    pool_recycle: int
Validation Types
Field Info
from pydantic.fields import FieldInfo
# Field validation types
StringConstraints = dict[str, Any]  # min_length, max_length, pattern
NumberConstraints = dict[str, Any]  # gt, ge, lt, le, multiple_of
Generic Types
Success Response
from typing import Generic, TypeVar
T = TypeVar('T')
class SuccessResponse(Generic[T]):
    """Generic success response."""
    success: bool = True
    data: T
    message: str | None = None
Error Response
class ErrorResponse:
    """Error response."""
    success: bool = False
    error: str
    details: dict[str, Any] | None = None
Paginated Response
class PaginatedResponse(Generic[T]):
    """Paginated response."""
    items: list[T]
    total: int
    page: int
    page_size: int
    pages: int
Example Usage
Using Provider Types
from ascender.core import AscModule, ClassProvider, ValueProvider, FactoryProvider
def create_config():
    return {"key": "value"}
@AscModule(
    providers=[
        ClassProvider(provide=MyService, useClass=MyService),
        ValueProvider(provide="API_KEY", useValue="secret"),
        FactoryProvider(provide="Config", useFactory=create_config),
    ]
)
class MyModule:
    pass
Using Generic Response Types
from ascender.common import Controller, GET, BaseResponse
from typing import Generic, TypeVar
T = TypeVar('T')
class ApiResponse(BaseResponse, Generic[T]):
    """Generic API response."""
    success: bool
    data: T
    message: str | None = None
@Controller("/api")
class ApiController:
    @GET("/users/:id")
    async def get_user(self, id: str) -> ApiResponse[dict]:
        """Return typed response."""
        user = await self.find_user(id)
        return ApiResponse(
            success=True,
            data=user,
            message="User found"
        )
Type Hints for Injection
from ascender.common import Injectable, inject
from typing import Protocol
class UserRepository(Protocol):
    """User repository interface."""
    async def find_by_id(self, id: str) -> dict: ...
    async def create(self, data: dict) -> dict: ...
@Injectable()
class UserService:
    """User service with typed dependencies."""
    def __init__(self, user_repo: UserRepository = inject()):
        self.user_repo = user_repo
See Also
- Dependency Injection - DI system and provider types
- Controllers - Route and HTTP types
- Modules - Module configuration types
- Python Type Hints - Official typing documentation