diff --git a/pydantic/validators.py b/pydantic/validators.py index a3069bcdbb0..7f5dee10094 100644 --- a/pydantic/validators.py +++ b/pydantic/validators.py @@ -50,6 +50,11 @@ Number = Union[int, float, Decimal] StrBytes = Union[str, bytes] + class TypedDict(Dict[str, Any]): + __annotations__: Dict[str, Type[Any]] + __required_keys__: FrozenSet[str] + __optional_keys__: FrozenSet[str] + def str_validator(v: Any) -> Union[str]: if isinstance(v, str): @@ -549,7 +554,7 @@ def named_tuple_validator(values: Tuple[Any, ...]) -> NamedTupleT: return named_tuple_validator -def make_typed_dict_validator(type_: Type[Dict[str, Any]]) -> Callable[[Any], Dict[str, Any]]: +def make_typed_dict_validator(type_: Type['TypedDict']) -> Callable[[Any], Dict[str, Any]]: from .main import create_model field_definitions: Dict[str, Any] = { @@ -558,7 +563,7 @@ def make_typed_dict_validator(type_: Type[Dict[str, Any]]) -> Callable[[Any], Di } TypedDictModel: Type['BaseModel'] = create_model('TypedDictModel', **field_definitions) - def typed_dict_validator(values: Dict[str, Any]) -> Dict[str, Any]: + def typed_dict_validator(values: 'TypedDict') -> Dict[str, Any]: return TypedDictModel(**values).dict(exclude_unset=True) return typed_dict_validator